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基础教程(26)find_package搜索包完成库链接和头文件添加(module模式)