Cmake入门(四)find_package

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://zhuanlan.zhihu.com/p/50829542

https://blog.csdn.net/u011092188/article/details/61425924

https://blog.csdn.net/haluoluo211/article/details/80559341

你可能感兴趣的:(Cmake学习笔记,Cmake,find_package,linux)