FindPkgConfig

一个用于 CMake 的 pkg-config 模块。

查找 pkg-config 可执行文件,并提供在 CMake 中使用它的命令

find_package(PkgConfig [<version>] [QUIET] [REQUIRED] [...])

pkg-config 是一个用于配置构建依赖信息的可执行命令行程序。最初由 FreeDesktop 开发,它也有多种实现,例如 pkgconf、u-config 等。它从所谓的 PC 元数据文件 (<module-name>.pc) 读取包数据,这些文件可能随包一起安装。此模块是 pkg-config 命令行可执行文件的包装器。

结果变量

此模块定义了以下变量

PkgConfig_FOUND

3.3 版本中新增。

一个布尔值,指示是否找到了(请求版本的)pkg-config 可执行文件。

PkgConfig_VERSION

版本 4.2 中添加。

找到的 pkg-config 的版本。

PKG_CONFIG_EXECUTABLE

pkg-config 程序的路径名。

PKG_CONFIG_ARGN

3.22 版本新增。

要传递给 pkg-config 的参数列表。

PKG_CONFIG_EXECUTABLEPKG_CONFIG_ARGN 都由模块初始化,但可以被用户覆盖。有关这些变量如何初始化,请参阅 提示

命令

如果找到 pkg-config,则此模块提供以下命令

pkg_check_modules

检查所有给定的模块,并在调用范围内设置各种结果变量

pkg_check_modules(
  <prefix>
  [QUIET]
  [REQUIRED]
  [NO_CMAKE_PATH]
  [NO_CMAKE_ENVIRONMENT_PATH]
  [IMPORTED_TARGET [GLOBAL]]
  <module-spec> [<module-spec>...]
)

参数为

<prefix>

添加到指定模块的结果变量的前缀字符串。

QUIET

如果给出此参数,则不会打印状态消息。

REQUIRED

如果给出此参数,如果未找到任何指定的模块,则命令将以错误失败。

NO_CMAKE_PATH, NO_CMAKE_ENVIRONMENT_PATH

3.3 版本中新增。

CMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH 缓存和环境变量将被添加到 pkg-config 搜索路径中。NO_CMAKE_PATHNO_CMAKE_ENVIRONMENT_PATH 参数分别禁用缓存变量和环境变量的此行为。PKG_CONFIG_USE_CMAKE_PREFIX_PATH 变量设置为 FALSE 会全局禁用此行为。

IMPORTED_TARGET [GLOBAL]

3.7 版本中新增。

此参数将创建一个 导入目标,命名为 PkgConfig::<prefix>,可以直接作为参数传递给 target_link_libraries()。它将一次封装所有指定模块 <module-spec>... 的使用要求。

GLOBAL

3.13 版本新增。

此参数与 IMPORTED_TARGET 一起使用,并将使导入目标在全局范围内可用。

3.15 版本新增:pkg-config 报告的非库链接器选项存储在 INTERFACE_LINK_OPTIONS 目标属性中。

3.18 版本更改:使用 -isystem 指定的包含目录存储在 INTERFACE_INCLUDE_DIRECTORIES 目标属性中。CMake 的早期版本将它们放在 INTERFACE_COMPILE_OPTIONS 属性中。

<module-spec>

每个 <module-spec> 可以是裸模块名称(如其 PC 元数据文件名 <module-name>.pc 中定义的),也可以是带有版本约束的模块名称(支持运算符 =<><=>=)。以下是名为 foo 的模块的各种约束示例

  • foo 匹配任何版本。

  • foo<2 仅匹配 2 之前的版本。

  • foo>=3.1 匹配 3.1 或更高版本的任何版本。

  • foo=1.2.3 要求 foo 必须恰好是版本 1.2.3。

结果变量

返回时可能会设置以下变量。存在两组值:一组用于常见情况(<XXX> = <prefix>),另一组用于 pkg-config 使用 --static 选项调用时提供的信息(<XXX> = <prefix>_STATIC)。

<XXX>_FOUND

如果模块存在,则设置为 1 的布尔变量。

<XXX>_LIBRARIES

仅包含库的列表(不带 -l)。

<XXX>_LINK_LIBRARIES

库及其绝对路径。

<XXX>_LIBRARY_DIRS

库的路径(不带 -L)。

<XXX>_LDFLAGS

所有必需的链接器标志。

<XXX>_LDFLAGS_OTHER

所有其他链接器标志。

<XXX>_INCLUDE_DIRS

-I 预处理器标志(不带 -I)。

<XXX>_CFLAGS

所有必需的 cflags。

<XXX>_CFLAGS_OTHER

其他编译器标志。

除了 <XXX>_FOUND 之外的所有变量都可能是 分号分隔的列表,如果关联变量从 pkg-config 返回具有多个值。

3.18 版本更改:使用 -isystem 指定的包含目录存储在 <XXX>_INCLUDE_DIRS 变量中。CMake 的早期版本将它们放在 <XXX>_CFLAGS_OTHER 中。

有一些特殊变量,其前缀取决于给定的 <module-spec> 的数量。当只有一个 <module-spec> 时,<YYY> 将简单地是 <prefix>,但如果给定了两个或多个 <module-spec> 项,则 <YYY> 将是 <prefix>_<module-name>

<YYY>_VERSION

模块的版本。

<YYY>_PREFIX

模块的安装目录。

<YYY>_INCLUDEDIR

模块的包含目录。

<YYY>_LIBDIR

模块的库目录。

3.8 版本更改:对于任何给定的 <prefix>pkg_check_modules() 可以使用不同的参数多次调用。CMake 的早期版本缓存并返回第一个成功的结果。

3.16 版本更改:如果无法确定找到的库的完整路径,但它仍然对链接器可见,则将其作为 -l<name> 传递。CMake 的早期版本在这种情况下失败。

pkg_search_module

从一个或多个提供的模块规范中搜索第一个成功的匹配项

pkg_search_module(
  <prefix>
  [QUIET]
  [REQUIRED]
  [NO_CMAKE_PATH]
  [NO_CMAKE_ENVIRONMENT_PATH]
  [IMPORTED_TARGET [GLOBAL]]
  <module-spec> [<module-spec>...]
)

此命令的行为和参数与 pkg_check_modules() 相同,除了它不是检查所有指定的模块,而是搜索第一个成功的匹配项。

例如,当已知某个包在不同的平台或版本上具有相同的包的可能的多个 <module-spec> 时,可以使用此命令。

结果变量

此命令定义与上述相同的变量,此外还有

<prefix>_MODULE_NAME

3.16 版新增。

如果找到模块,变量 <prefix>_MODULE_NAME 将包含匹配模块的名称。如果需要使用 pkg_get_variable() 命令,并带有 <module-name> 参数,该参数由 pkg_search_module() 找到,则可以使用此变量。

pkg_get_variable

3.4 版本新增。

检索 pkg-config 变量的值,并将其存储在调用作用域中的结果变量中

pkg_get_variable(
  <result-var>
  <module-name>
  <var-name>
  [DEFINE_VARIABLES <key>=<value>...]
)

参数为

<result-var>

将包含 pkg-config 变量值的结果变量的名称。如果 pkg-config 为指定的变量 <var-name> 返回多个值,则 <result-var> 将包含一个 分号分隔的列表

<module-name>

模块名称,如其 PC 元数据文件名中定义 (<module-name>.pc)。

<var-name>

PC 元数据文件 <module-name>.pc 中的 pkg-config 变量名称。

DEFINE_VARIABLES <key>=<value>...

版本 3.28 新增。

指定键值对以重新定义影响使用 pkg-config 检索的变量的变量。

提示

在调用 find_package(PkgConfig) 之前,此模块接受以下变量以影响此模块的行为

ENV{PKG_CONFIG_PATH}

环境变量,指定 pkg-config 在其中搜索其 .pc 文件的其他路径。 pkg-config 工具默认使用此变量,而 CMake 还提供更常用的 CMAKE_PREFIX_PATH 变量来指定查找包及其 .pc 文件的其他路径。

ENV{PKG_CONFIG}

版本 3.1 中新增。

环境变量,可以设置为 pkg-config 可执行文件的路径,如果尚未设置,则可用于初始化 PKG_CONFIG_EXECUTABLE 变量。

PKG_CONFIG_EXECUTABLE

可以使用此缓存变量设置为 pkg-config 可执行文件的路径。 模块内部使用此变量调用 find_program()

版本 3.22 更改:如果设置了 PKG_CONFIG 环境变量,则在使用它作为提示时,仅采用它的第一个参数。

PKG_CONFIG_ARGN

3.22 版本新增。

可以使用此缓存变量设置为要传递给 pkg-config 的其他参数的列表(如果需要)。 如果未提供,则如果已设置,则会从 PKG_CONFIG 环境变量初始化。 该环境变量中的第一个参数假定为 pkg-config 程序,而之后的所有参数都用于初始化 PKG_CONFIG_ARGN。 如果未定义此类环境变量,则 PKG_CONFIG_ARGN 将初始化为空字符串。 模块不会在将其设置为缓存后更新该变量。

PKG_CONFIG_USE_CMAKE_PREFIX_PATH

版本 3.1 中新增。

指定 pkg_check_modules()pkg_search_module() 是否应将 CMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH 缓存和环境变量中的路径添加到 pkg-config 搜索路径。

如果未设置此变量,则如果 CMAKE_MINIMUM_REQUIRED_VERSION 为 3.1 或更高版本,则默认启用此行为,否则禁用此行为。

已弃用变量

以下变量提供用于向后兼容性

PKG_CONFIG_FOUND

自版本 4.2 起已弃用:使用 PkgConfig_FOUND,它具有相同的值。

一个布尔值,指示是否找到了(请求版本的)pkg-config 可执行文件。

PKG_CONFIG_VERSION_STRING

自版本 4.2 起已弃用:使用 PkgConfig_VERSION,它具有相同的值。

找到的 pkg-config 的版本。

示例

示例:查找 pkg-config

查找 pkg-config

find_package(PkgConfig)

查找 pkg-config 并使其成为必需的(如果未找到,则处理将停止并显示错误消息)

find_package(PkgConfig REQUIRED)

安静地查找 pkg-config,不打印状态消息,如在查找模块中常用

find_package(PkgConfig QUIET)

示例:使用 pkg_check_modules()

检查任何版本的 glib2。 如果找到,则输出变量 GLIB2_VERSION 将保存找到的实际版本

find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
  pkg_check_modules(GLIB2 glib-2.0)
endif()

以下示例查找至少版本为 2.10 的 glib2。 如果找到,则输出变量 GLIB2_VERSION 将保存找到的实际版本

find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
  pkg_check_modules(GLIB2 glib-2.0>=2.10)
endif()

以下示例查找 glib2-2.0(至少版本为 2.10)和任何版本的 gtk2+-2.0。 只有在找到两者时,FOO 才会被认为已找到。 变量 FOO_glib-2.0_VERSIONFOO_gtk+-2.0_VERSION 将设置为各自找到的模块版本。

find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
  pkg_check_modules(FOO glib-2.0>=2.10 gtk+-2.0)
endif()

以下示例需要任何版本的 xrender

find_package(PkgConfig QUIET REQUIRED)
pkg_check_modules(XRENDER REQUIRED xrender)

成功调用时设置的示例输出变量

XRENDER_LIBRARIES=Xrender;X11
XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp

示例:使用 pkg_search_module()

搜索 LibXml2 包,该包可能以不同的模块规范提供(libxml-2.0libxml2

find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
  pkg_search_module(BAR libxml-2.0 libxml2 libxml>=2)
endif()

示例:创建导入目标

在以下示例中,从模块规范创建导入目标,以便直接在项目中使用的,而无需使用查找模块。 这些导入目标可用于例如,在已知包在所有受支持平台上都支持 pkg-config 的情况下

find_package(PkgConfig QUIET REQUIRED)
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk4>=4.14)
target_link_libraries(example PRIVATE PkgConfig::GTK)

示例:使用 pkg_get_variable()

从包 Gobject 检索 pkg-config 变量 girdir 的值

find_package(PkgConfig QUIET)

if(PkgConfig_FOUND)
  pkg_get_variable(GI_GIRDIR gobject-introspection-1.0 girdir)
endif()

message(STATUS "${GI_GIRDIR}")

另请参阅

  • cmake_pkg_config() 命令提供了一种现代且更高级的方法,可以在 CMake 中使用 pkg-config,而无需安装 pkg-config 可执行文件。

  • 查找模块 了解如何编写查找模块的详细信息。