Cmake中find_package命令的搜索模式之配置模式(Config mode)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cmake中find_package命令的搜索模式之配置模式(Config mode)相关的知识,希望对你有一定的参考价值。
参考技术A 前面有介绍过 find_package 的两种搜索模式之一模块模式(请参考 Cmake命令之find_package介绍 和 模块模式 ),本文将介绍另外一种模式:配置模式。该模式下, CMake 会搜索 <lowercasePackageName>-config.cmake 文件或 <PackageName>Config.cmake 文件。如果 find_package 命令中指定了具体的版本,也会搜索 <lowercasePackageName>-config-version.cmake 或 <PackageName>ConfigVersion.cmake 文件,因此配置模式下通常会提供配置文件和版本文件(注意形式上要保持一致),并且作为包的一部分一起提供给使用者。
同样的,当 find_package 调用返回时,一系列跟包相关的变量也会提供给调用者。例如 <PackageName>_FOUND 标识包是否找到、 <PackageName>_DIR 变量用于指示包配置文件所在的位置。实际上,返回的变量并没有特别的限制,但是还是建议遵循 模块模式 的标准变量名称的命名规则。
一个配置文件方式提供的包由 包配置文件 (必须包含,名为 <lowercasePackageName>-config.cmake 文件或 <PackageName>Config.cmake )和 包版本文件 (可选,名为 <lowercasePackageName>-config-version.cmake 或 <PackageName>ConfigVersion.cmake )组成。配置文件和版本文件的命名要配对出现,也就是:
或者是:
仍然是以我们自己编写的 mymath 库为例,假设 mymath 库提供了如下的文件:
mymathConfig.cmake 文件有两种方式可以生成:
可以参考 Cmake命令之find_package介绍 的 4.1 章节查看 .cmake 文件的搜索路径,我们的例子将在 find_package 中通过 PATHS 来指定。
find_package 找到一个配置文件后,会尝试去查找版本文件。版本文件的主要作用是用来验证包的版本是否与 find_package 命令中指定的版本信息匹配。如果匹配的话,就会使用配置文件中的内容,否则会忽略配置文件中的内容。
和配置文件一样,版本文件也有两种方式生成:
当 find_package 命令在加载版本文件时,首先会通过从 find_package 中得到的版本信息设置如下变量,用于版本文件中版本对比:
在版本文件中可以使用上述变量来检查版本的兼容性、版本是否匹配,并设置如下变量作为返回结果:
find_package 会检查上述变量,如果版本匹配成功,那么 find_package 会返回如下变量给调用者:
mymath 库的 CMakeLists.txt 内容如下:
在命令行中执行 cmake . 和 make 生成 libmymath.a 库。
mymath 库及其提供的 .cmake 配置文件见本文的第二章节。下面来编写测试文件:
在命令行中执行 cmake . 和 make 生成 test 可执行文件并执行 ./test ,对应的输出结果如下(摘取重要部分呈现):
find_package的默认搜索路径是什么( )使用cmake时的功能?
我还想知道当find_package(<package>)
在Linux(Ubuntu)中找到<package>
时设置的默认变量?
答案
将我的评论转化为答案
如果你必须将它融化在“最重要的一条”路径上,那么CMake's own module path将包含预装的Find...
模块。
将CMake指向自定义路径的最重要的全局变量变量是CMAKE_MODULE_PATH
。
如果你想查看CMake在你的情况下搜索哪些目录,只需打电话
cmake -D CMAKE_FIND_DEBUG_MODE=ON ..
整个“搜索算法”记录在find_package()
command documentation中:
- 在cmake特定的缓存变量中指定的搜索路径。如果传递
NO_CMAKE_PATH
,则可以跳过此操作:CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH
- 在cmake特定的环境变量中指定的搜索路径。如果传递
NO_CMAKE_ENVIRONMENT_PATH
,则可以跳过此操作:<package>_DIR CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH
- 搜索
HINTS
选项指定的路径。应使用PATHS
选项指定硬编码猜测。- 搜索标准系统环境变量。如果传递
NO_SYSTEM_ENVIRONMENT_PATH
,则可以跳过此操作:PATH
- 搜索存储在CMake用户包注册表中的路径。如果传递
NO_CMAKE_PACKAGE_REGISTRY
或将CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
设置为TRUE
,则可以跳过此操作。- 搜索当前系统的Platform文件中定义的cmake变量。如果传递
NO_CMAKE_SYSTEM_PATH
,则可以跳过此操作:CMAKE_SYSTEM_PREFIX_PATH CMAKE_SYSTEM_FRAMEWORK_PATH CMAKE_SYSTEM_APPBUNDLE_PATH
- 搜索存储在CMake System Package Registry中的路径。如果传递
NO_CMAKE_SYSTEM_PACKAGE_REGISTRY
或将CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY
设置为TRUE
,则可以跳过此操作。- 搜索
PATHS
选项指定的路径。这些通常是硬编码的猜测。
以上是关于Cmake中find_package命令的搜索模式之配置模式(Config mode)的主要内容,如果未能解决你的问题,请参考以下文章
CMake基础教程(26)find_package搜索包完成库链接和头文件添加(module模式)