Cmake中find_package命令的搜索模式之模块模式(Module mode)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cmake中find_package命令的搜索模式之模块模式(Module mode)相关的知识,希望对你有一定的参考价值。

参考技术A   前面介绍了 find_package 有两种搜索包的模式(参考 find_package介绍 ),本篇文章介绍其中的一种:模块模式( Module Mode )。在这种模式下,当调用 find_package 命令查找 <PackageName> 包的时候,实际上会去查找一个名为 Find<PackageName>.cmake 的文件,这个文件的主要任务就是确定一个包是否可用,查找的结果会反映在变量 <PackageName>_FOUND 上供 find_package 的调用者使用。当找到可用的包,同时也会提供使用这个包所需要的变量、宏和导入目标(例如库文件)。
  前面已经介绍过使用系统提供的 FindLibLZMA.cmake 来查找 LibLZMA 库,这个文件是 CMake 在安装的时候就提供的,位于 CMake 的安装目录之下。因此对于未提供该文件的第三方库,我们可以通过自己生成 Find<PackageName>.cmake 来供 CMake 使用,接下来将介绍如何利用自己生成的 .cmake 文件找到自己编写的库。
   模块模式 依赖另一个程序: pkg-config ,在继续往下之前,请参考 pkg-config用法详解 了解这个命令。

   Find<PackageName>.cmake 文件承担了定义 <PackageName> 包相关的变量的作用,这些变量称作"标准变量"。一旦 find_package 调用成功,这些变量将返回给调用者使用,为了保证不同的包之间返回的变量不冲突,对编写的 Find<PackageName>.cmake 返回的标准变量名称有如下约束:所有的变量都是以 PackageName_ 开头, PackageName 就是文件 Find<PackageName>.cmake 中的 <PackageName> ,必须完全一致,大小写敏感。简单的列举几个变量定义如下,更多的变量定义见本文的 四、对标准变量名称的更多说明 :

  接下来我们来写一个 .cmake 文件,假设我们的包名为 mymath ,该包提供一个 libmymath.a 的库,其中包含一个 add 接口,简单计算两个整数的和并打印出结果(对这个库的更多信息可以参考 pkg-config用法详解 的 4.1 ~ 4.3 小节)。在编写 Findmymath.cmake 之前,我们先来看下 .cmake 文件的格式。

  假定我们使用的库 mymath 已经提供了 .pc 文件,并能够通过 pkg-config 方式找到它(可以通过 pkg-onfig --list-all 查看到 mymath 库,参考 pkg-config用法详解 )。

  接下来我们来编写库 mymath 的 Findmymath.cmake 文件,参照前面 .cmake 文件说明,内容如下,示例只提供了库目录、库文件、头文件等少量变量信息:

  我们的测试文件 test.cpp 如下:

  最后,在我们的 CMakeLists.txt 来使用 find_package 来找到并使用 mymath 库

  在 CMakeLists.txt 下执行 cmake 命令,此处为了演示,直接指定 CMAKE_MODULE_PATH 的值为当前的 .cmake 所在路径,这样 find_package 命令会直接找到我们编写的 .cmake 文件并读取其中的内容,编译并运行最终程序(只摘取了我们关注的显示信息):

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

前面我们介绍了find_package有两种模式,学习了module模式的使用,接下来我们介绍大多数第三方库都采用的模式:config模式。

语法

find_package(<PackageName> [version] [EXACT] [QUIET]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [CONFIG|NO_MODULE]
             [NO_POLICY_SCOPE]
             [NAMES name1 [name2 ...]]
             [CONFIGS config1 [config2 ...]]
             [HINTS path1 [path2 ... ]]
             [PATHS path1 [path2 ... ]]
             [PATH_SUFFIXES suffix1 [suffix2 ...]]
             [NO_DEFAULT_PATH]
             [NO_PACKAGE_ROOT_PATH]
             [NO_CMAKE_PATH]
             [NO_CMAKE_ENVIRONMENT_PATH]
             [NO_SYSTEM_ENVIRONMENT_PATH]
             [NO_CMAKE_PACKAGE_REGISTRY]
             [NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
             [NO_CMAKE_SYSTEM_PATH]
             [NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
             [CMAKE_FIN

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

Cmake命令之find_package介绍

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

CMake中find_package的使用

cmake的find_package()简单总结

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

CMake系列专题--find_package