当前位置: 首页 > 工具软件 > check_mk > 使用案例 >

CMAKE查找库:find_package和pkg_check_moduls的区别

西门庆
2023-12-01

本文介绍 CMake 中两种查找库的方式:find_package 以及 pkg_check_modules 的用法与区别。

find_package

如果编译软件使用了外部库,事先并不知道它的头文件和链接库的位置,得在编译和链接命令中加上包含它们的查找路径,CMake 使用 find_package 命令来解决这个问题。

FIND_PACKAGE( <name> [version] [EXACT] [QUIET] [NO_MODULE] [ [ REQUIRED | COMPONENTS ] [ componets... ] ] )
这条命令执行后,CMake 会到变量CMAKE_MODULE_PATH 指示的目录下查找文件 Findname.cmake 并执行;
只要找到包,就会定义下面这些变量(都在 Findname.cmake 文件中设置):
<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS
要使用库name,我们在顶层目录中的 CMakeLists.txt 文件中,检查变量**NAME_FOUND** 来确定包是否被找到(大部分包的这些变量中的包名是全大写的,有些包则使用包的实际大小写)
如果找到这个包,我们用**NAME_INCLUDE_DIRS**调用 include_directories() 命令,用**NAME_LIBRARIES**调用 target_link_libraries() 命令。

pkg_check_modules

pkg_check_modules 是 CMake 自己的 pkg-config 模块 的一个用来简化的封装:你不用再检查 CMake 的版本,加载合适的模块,检查是否被加载,等等,参数和传给 find_package 的一样:先是待返回变量的前缀,然后是包名(pkg-config 的)。这样就定义了<prefix>_INCLUDE_DIRS和其他的这类变量,后续的用法就与 find_package 一致。
pkg_check_modules 实质上是检测系统中的 pkg-config 是否存在指定的 .pc 文件。

pkg-config

  • pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use gcc -o test test.c pkg-config –libs –cflags glib-2. 0for instance, rather than hard-coding values on where to find glib (or other libraries).
      It is language-agnostic, so it can be used for defining the location of documentation tools, for instance. 输出已安装的库的相关信息,包括:
    C/C++编译器需要的输入参数
    链接器需要的输入参数
    已安装软件包的版本信息
      pkg-config works on multiple platforms: Linux and other UNIX-like operating systems, Mac OS X and Windows. It does not require anything but a reasonably well working C compiler and a C library, but can use an installed glib if that is present. (A copy of recent glib2 is shipped together with pkg-config versions since 0.27, and this is sufficient for pkg-config to compile and work properly.)
      工作原理:当安装一个库时(例如从 RPM,deb 或其他二进制包管理系统),会包括一个后缀名为 pc 的文件,它会放入某个文件夹下 (依赖于你的系统设置,例如,Linux 为 该库文件所在文件夹/lib/pkgconfig)。并把该子文件夹加入 pkg-config 的环境变量PKG_CONFIG_PATH 作为搜索路径。

find_package() 寻找 cmake 目录下的 .cmake 配置文件,可能位于 /usr/lib/cmake 或者 /usr/local/lib/cmake 目录下
pkg_check_module() 寻找 pkgconfig 目录下的 .pc 配置文件,同样也可能位于上述目录下

what is the difference between find_package and pkg_search_module

  • pkg_search_module使用pkg-config工具确定请求的库的位置。这在已经使用pkg-config的系统上最有用,因此您不需要为CMake复制所有信息。请注意,此方法存在潜在的可移植性问题,因为它要求在构建计算机上正确设置pkg-config。

  • 另一方面,find_package是CMake自己解决相同问题的机制。为此,您可能需要一个用于请求的库的CMake查找脚本(CMake已经附带了其中的两个,但您可以轻松编写自己的脚本),或者是由请求的库本身提供的软件包配置脚本。无论哪种情况,您都可能需要调整CMAKE_MODULE_PATH才能使CMake能够找到相应的脚本。
    使用哪种选择非常简单:

    如果库提供的话,优先选择软件包配置脚本。
    使用查找脚本作为不了解CMake的库的后备。
    如果要利用pkg-config的协同作用,请使用pkg_search_module。特别是,请注意,可以使用pkg_search_module来实现查找脚本,作为获取所需信息的一种方法。

 类似资料: