CMakeLists.txt中FIND_PACKAGE()是如何工作的?

官方文档:https://cmake.org/cmake/help/latest/command/find_package.html

FIND_PACKAGE(<PackageName>)如何查找头文件和库文件路径?
有两种模式:Module模式和Config模式。

1. Module模式

该模式通过寻找Find<PackageName>.cmake文件,由该文件找到对应的库以及路径。
Find<PackageName>.cmake文件负责查找包、检查版本、提供任何所需的消息。
查找Find<PackageName>.cmake文件有两种方式:

  1. 首先,通过CMAKE_MODULE_PATH变量指定的目录查找。
  2. 其次,在<cmake安装目录>/Modules文件夹内查找。
    ubuntu默认cmake安装在/usr/share/cmake-3.16目录。

如果没有找到对应的.cmake文件,则进入Config模式。如果指定了MODULE选项,则只在Module模式下寻找。

2. Config模式

该模式查找<PackageName>Config.cmake<lower-case-package-name>-config.cmake文件。cmake会创建<PackageName>_DIR 变量存储含有上述文件的路径。
如果.cmake文件未找到,会生成错误信息。
可以手动设置<PackageName>_DIR,如果对应的路径中没有.cmake文件,则会忽略该路径。

查找过程:

对于要查找的包,CMake生成一组可能的安装路径前缀<prefix>,对于每个<prefix>,将查找以下路径:

  • <prefix>/ (W)
  • <prefix>/(cmake|CMake)/ (W)
  • <prefix>/<name>*/ (W)
  • <prefix>/<name>*/(cmake|CMake)/ (W)
  • <prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
  • <prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
  • <prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
  • <prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
  • <prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U)
  • <prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
    其中W代表Windows系统,U代表UNIX系统。这只是惯例,实际上在Windows或UNIX系统上述所有路径都会搜索到。

关于如何生成<prefix>,官方文档给出了九条说明:
在这里插入图片描述

FIND_PACKAGE(OpenCV REQUIRED)命令如何找到OpenCV?

由第7条说明中的变量:CMAKE_SYSTEM_PREFIX_PATH,它包含以下路径:

  • /usr

根据第五条前缀查询规则:<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/,cmake查找到了这个路径:

  • /usr/lib/x86_64-linux-gnu/cmake/opencv4

这也就是变量OpenCV_DIR的值。而该路径中的OpenCVConfig.cmake文件中又有如下定义:

  1. 设置变量OpenCV_INSTALL_PATH值为当前路径向上四层,即/usr目录
  2. 设置变量OpenCV_INCLUDE_DIRS值为${OpenCV_INSTALL_PATH}/include/opencv4

因此,CMakeList.txt文件中的变量OpenCV_INCLUDE_DIRS的值为/usr/include/opencv4


同理,在CMakeList.txt文件中加入:

  • SET(OpenCV_DIR /opt/opencv4.5.0/lib/cmake/opencv4)

则CMake查找到/opt/opencv4.5.0/lib/cmake/opencv4路径下的OpenCVConfig.cmake文件,该文件定义:

  1. 设置变量OpenCV_INSTALL_PATH值为当前路径向上三层,即/opt/opencv4.5.0目录
  2. 设置变量OpenCV_INCLUDE_DIRS值为${OpenCV_INSTALL_PATH}/include/opencv4

因此此时变量OpenCV_INCLUDE_DIRS的值为/opt/opencv4.5.0/include/opencv4

到这里,CMake终于找到了系统中的OpenCV。

*注意:当你曾经成功运行FIND_PACKAGE(OpenCV REQUIRED)命令并找到了opencv的安装路径,CMake就会将该路径存入变量OpenCV_DIR中,如果不手动清空变量OpenCV_DIR,则该值可能一直存在并指向某个版本的OpenCV的安装位置,导致无法让CMake找到其他安装位置、其他版本的OpenCV,亦或使你的CMakeList.txt中的错误被掩盖。我使用的两个方法是:1. 删除build文件夹重新生成;2.使用Clion中Tools | CMake | Reset Cache and Reload Project功能

FIND_PACKAGE(OpenCV REQUIRED)命令如何找到Eigen?

Eigen3Config.cmake文件位置:/usr/lib/cmake/eigen3/Eigen3Config.cmake

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值