0. 摘要
这篇文章主要是讲解find_package的搜索方式, 虽然用起来很简单, 但是编译的时候出问题的也经常是这个find_package, 所以这篇文章结合官网的说明以及找到的靠谱博客探讨一下find_package的要点.
1.find_package的两种搜索模式
1.1. 模块模式Module
首先CMake默认就是Module模式, 在此模式下, CMake会搜索由程序开发者list命令指定的CMAKE_MODULE_PATH
路径下文件Find<package>.cmake
, 如果找不到再去CMake安装目录下的Module目录下找Find<package>.cmake
文件, 如果找不到, CMake就会切换到配置模式来搜索库文件.
注意:
CMAKE_MODULE_PATH
list of directories specifying a search path for CMake modules to be loaded by the the include() or find_package() commands before checking the default modules that come with CMake. By default it is empty, it is intended to be set by the project.
1.2. 配置模式Config
1.2.1. 如果在find_package
命令中直接指定了CONFIG
选项, 则CMake会跳过Module模式, 直接使用Config模式来寻找库文件.
1.2.2. 这种模式下, CMake会在某些路径下搜索<name>Config.cmake
或 <lower-case-name>-config.cmake
文件, 如果还找不到对应的package, 我们需要set一个<package>_DIR
指令, 告诉config文件的路径(比如安装了不同版本的OpenCV, 就需要我们指定<package>_DIR
路径).
1.2.3. 如果<package> _DIR
设置的目录不包含配置文件, CMake将忽略它并从头开始搜索。(我本地尝试了一下, 还是挺智能的, 骗不到CMake: 我将OpenCV的查找路径指定到其他路径, CMake依然还是找到了).
If _DIR has been set to a directory not containing a configuration file CMake will ignore it and search from scratch.
1.3. 流程
1.3.1. 其他
Ubuntu 16.04.6 的CMake版本3.5.1
(我使用的);
CLion2018自带的CMake版本3.10.3
;
2. 参考资料
[1]. 深入理解CMake(3):find_package()的使用
[2]. 官网find_package详解
[3]. 现代CMake编程