参考:Cmake之深入理解find_package()的用法
参考博客写的非常好,推荐仔细看博客。另外博客中有github 代码链接,可以参考代码进行理解。
1.查找模式
总结来说find_package 命令有两种模式:
-
Module模式 : cmake 需要找到一个叫做Find<LibraryName>.cmake 的文件。这个文件负责找到库所在的路径,为我们的项目引入头文件路径和库文件路径。cmake 搜索这个文件的路径有两个,一个是cmake 安装目录下的share/cmake-<version>/Modules 目录,另一个是我们指定的CMAKE_MODULE_PATH 的目录。 -
Config模式:如果Module 模式搜索失败,没有找到对应的Find<LibraryName>.cmake 文件,则转入Config 模式进行搜索。它主要通过<LibraryName>Config.cmake or <lower-case-package-name>-config.cmake 这两个文件来引入我们需要的库。以安装的glog 库为例,在我们安装之后,它在/usr/local/lib/cmake/glog/ 目录下生成了glog-config.cmake 文件,而/usr/local/lib/cmake/<LibraryName>/ 正是find_package函数的搜索路径之一。
2.关键字解释
参考:深入理解CMake(3):find_package()的使用 ,这个博客写的也很好,建议仔细阅读。
version 和EXACT : 都是可选的,version 指定的是版本,如果指定就必须检查找到的包的版本是否和version 兼容。如果指定EXACT 则表示必须完全匹配的版本而不是兼容版本就可以。
QUIET 可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED 字段,则QUIET 无效,仍然会输出查找失败提示语)。
MODULE 可选字段。前面提到说“如果Module 模式查找失败则回退到Config 模式进行查找”,但是假如设定了MODULE 选项,那么就只在Module 模式查找,如果Module模式下查找失败并不回落到Config 模式查找。
REQUIRED 可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake 。而如果不指定REQUIRED 则cmake 会继续执行。
COMPONENTS ,components :可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED ,导致cmake 停止执行。
OPTIONAL_COMPONENTS 和components :可选的模块,找不到也不会让cmake 停止执行。
|