Cmake入门(四)find_package

本文深入解析CMake中find_package指令的工作原理,介绍通过模块模式和配置模式查找库配置文件的过程,以及如何在CMakeLists中正确使用找到的库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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里面一般会定义下面这些变量:

<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值