本文共 1218 字,大约阅读时间需要 4 分钟。
find_package是Cmake中非常重要的一条指令,用法简单,功能强大。
先介绍一下它的运作流程,以用途最大的opencv为例:
1.find_package
在一些目录中查找OpenCV的配置文件。
2.找到后,find_package
会将头文件目录设置到${OpenCV_INCLUDE_DIRS}
中,将链接库设置到${OpenCV_LIBS}
中。
3.设置可执行文件的链接库和头文件目录,编译文件。
因此,我们的CMakeLists就可以这样去写:
add_executable(Main main.cpp)find_package(OpenCV REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})target_link_libraries(Main ${OpenCV_LIBS})
在了解完用法之后,自然而然出现的问题就是:find_package这个指令是如何找到Opencv的配置文件的?
两种模式:模块模式和配置模式。不管是哪种模式,都希望找到一个*.cmake文件。
模块模式是指:先从变量${CMAKE_MODULE_PATH}
中的所有目录里开始找,如果没有,然后再查看它自己的模块目录 /share/cmake-x.y/Modules/ )。这称为模块模式。
配置模式是指:从~/.cmake/packages/或/usr/local/share/中的各个包目录中查找,寻找<库名字的大写>Config.cmake 或者 <库名字的小写>-config.cmake (比如库Opencv,它会查找/usr/local/share/OpenCV中的OpenCVConfig.cmake或opencv-config.cmake),这称为配置模式。
找到*.cmake以后,cmake里面一般会定义下面这些变量:
_FOUND _INCLUDE_DIRS or _INCLUDES _LIBRARIES or _LIBRARIES or _LIBS _DEFINITIONS
注意上面的内容,特别是or这个词。因此在CmakeLists中,“include_directories(${OpenCV_INCLUDE_DIRS})”应该是可以换成“include_directories(${OpenCV_INCLUDES})”的,同样在把库链接到可执行文件的时候,也可以把OpenCV_LIBS换成是OpenCV_LIBRARIES等等。
关于这块内容,我个人认为理解到这里就已经够了,如果还想要进一步追究其细节,一些朋友已经给出了比较好的解释,因此我也不需要复述或者照搬,直接列出地址:
转载地址:https://blog.csdn.net/zkk9527/article/details/89256873 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!