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中:

  1. 在cmake特定的缓存变量中指定的搜索路径。如果传递NO_CMAKE_PATH,则可以跳过此操作: CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH
  2. 在cmake特定的环境变量中指定的搜索路径。如果传递NO_CMAKE_ENVIRONMENT_PATH,则可以跳过此操作: <package>_DIR CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH
  3. 搜索HINTS选项指定的路径。应使用PATHS选项指定硬编码猜测。
  4. 搜索标准系统环境变量。如果传递NO_SYSTEM_ENVIRONMENT_PATH,则可以跳过此操作: PATH
  5. 搜索存储在CMake用户包注册表中的路径。如果传递NO_CMAKE_PACKAGE_REGISTRY或将CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY设置为TRUE,则可以跳过此操作。
  6. 搜索当前系统的Platform文件中定义的cmake变量。如果传递NO_CMAKE_SYSTEM_PATH,则可以跳过此操作: CMAKE_SYSTEM_PREFIX_PATH CMAKE_SYSTEM_FRAMEWORK_PATH CMAKE_SYSTEM_APPBUNDLE_PATH
  7. 搜索存储在CMake System Package Registry中的路径。如果传递NO_CMAKE_SYSTEM_PACKAGE_REGISTRY或将CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY设置为TRUE,则可以跳过此操作。
  8. 搜索PATHS选项指定的路径。这些通常是硬编码的猜测。

以上是关于Cmake中find_package命令的搜索模式之配置模式(Config mode)的主要内容,如果未能解决你的问题,请参考以下文章

Cmake命令之find_package介绍

CMake基础教程(26)find_package搜索包完成库链接和头文件添加(module模式)

CMake中find_package的使用

cmake的find_package()简单总结

CMake基础教程(27)find_package搜索包完成库链接和头文件添加(config模式)

CMake系列专题--find_package