cmake:pkg_check_modules

2023-05-16

此文为:轻松入门cmake系列教程

理论

是什么?

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

工作原理

当安装某些库时(例如从RPM,deb或其他二进制包管理系统),会包括一个后缀名为 pc 的文件,它会放入某个文件夹下(依赖于系统设置,例如,Linux 为该库文件所在文件夹/lib/pkgconfig),并把该子文件夹加入pkg-config的环境变量PKG_CONFIG_PATH作为搜索路径。

pkg_check_modules实质上是检测系统中的 pkg-config 是否存在指定的 .pc 文件。

关于PKG_CONFIG_PATH

会在目录${PKG_CONFIG_PATH}寻找.pc文件

在环境变量中设置

执行echo $PKG_CONFIG_PATH

echo $PKG_CONFIG_PATH

在这里插入图片描述
解决:
1、查看自己的 pkgconfig 路径在哪里

find / -name pkgconfig

在这里插入图片描述
可以看出有三个,随意选择一个就可以

2、设置路径

export PKG_CONFIG_PATH=/usr/lib64/pkgconfig/:$PKG_CONFIG_PATH

在cmakelists.txt中设置

set(ENV{PKG_CONFIG_PATH}
  ${CMAKE_SOURCE_DIR}/libs/lib/pkgconfig:/opt/ffmpeg/lib/pkgconfig:$ENV{PKG_CONFIG_PATH})

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来实现查找脚本,作为获取所需信息的一种方法。

使用示例

find_package(PkgConfig REQUIRED)

pkg_check_modules(LIBUV REQUIRED libuv)
set(NETDATA_COMMON_CFLAGS ${NETDATA_COMMON_CFLAGS} ${LIBUV_CFLAGS_OTHER})
set(NETDATA_COMMON_LIBRARIES ${NETDATA_COMMON_LIBRARIES} ${LIBUV_LIBRARIES})
set(NETDATA_COMMON_INCLUDE_DIRS ${NETDATA_COMMON_INCLUDE_DIRS} ${LIBUV_INCLUDE_DIRS})

前提:安装了libuv,并且将libuv.pc复制到了/usr/lib64/pkgconfig/路径下。否则出错: – Checking for module ‘libuv’
– No package ‘libuv’ found

官网翻译

官方文档

FindPkgConfig

CMake的pkg-config模块。

找到pkg-config可执行文件并添加pkg_get_variable()、pkg_check_modules()和pkg_search_module()命令。以下变量也将被设置:

  • PKG_CONFIG_FOUND:是否找到pkg-config可执行文件
  • PKG_CONFIG_EXECUTABLE:pkg-config程序的路径
  • PKG_CONFIG_VERSION_STRING:pkg-config版本(自CMake 2.8.8以来)

pkg_check_modules

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

pkg_check_modules(<prefix>
                  [REQUIRED] [QUIET]
                  [NO_CMAKE_PATH]
                  [NO_CMAKE_ENVIRONMENT_PATH]
                  [IMPORTED_TARGET [GLOBAL]]
                  <moduleSpec> [<moduleSpec>...])

(0)<prefix>。举个例子

pkg_check_modules(SDL2 IMPORTED_TARGET  sdl2)
  • 意思是:
    • 我们要去默认路径下找叫做sdl2模块的库
    • 如果找到了,就生成一个叫做PkgConfig:SDL2的导入目标,这个目标可以直接用到target_link_libraries语句中
    • pkg_check_modules(....)执行完毕之后,会生成如下变量(SDL2就是<prefix>,可以自己起一个容易记住的名字,随便起):
SDL2_FOUND:如果模块存在,则设置为1
SDL2_LIBRARIES:只有库(没有“-l”)
SDL2_LINK_LIBRARIES:库及其绝对路径
SDL2_LIBRARY_DIRS:库的路径(没有“-L”)
SDL2_LDFLAGS:所有必需的链接器标志
.....
  • 然后,我们就可以这样利用了
pkg_check_modules(SDL2  IMPORTED_TARGET sdl2)
if (SDL2_FOUND)
        include_directories(${SDL2_INCLUDE_DIRS})
        link_directories(${SDL2_LIBRARY_DIRS})
        list(APPEND LINK_LIB_LIST ${SDL2_LIBRARIES})
        target_link_libraries(${PROJECT_NAME}  PkgConfig::SDL2)
        message(STATUS "found library:${SDL2_LIBRARIES}")
endif ()

再举个例子,如下:

pkg_check_modules(ffmpeg REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil)
  • 去默认路径下,libavcodec libavformat libavutil这三个库,如果都找到了,那么,会生成如下变量:
ffmpeg_FOUND:如果模块存在,则设置为1
ffmpeg_LIBRARIES:只有库(没有“-l”)
......

(1) REQUIRED:可选。意为“必须”

  • 如果找不到模块,命令将失败并报错,并停止运行
  • 如果不选择,那么没有找到这个模块,那么就跳过

(2)QUIET:也是可选的。意为“安静”,当填写此参数,将会静默输出,不会打印任何信息
(3)NO_CMAKE_PATHNO_CMAKE_ENVIRONMENT_PATH,也是可选的

  • 默认情况下,CMAKE_PREFIX_PATH、CMAKE_FRAMEWORK_PATH和CMAKE_APPBUNDLE_PATH缓存和环境变量将被添加到pkg-config搜索路径。
  • 如果填写了这两个参数,NO_CMAKE_PATHNO_CMAKE_ENVIRONMENT_PATH参数就不去缓存路径和环境变量路径中搜索了

(4)[IMPORTED_TARGET [GLOBAL]]

  • IMPORTED_TARGET参数将创建一个名为PkgConfig::< prefix>的导入目标,该目标可以作为参数直接传递给target_link_libraries()。
  • GLOBAL参数将使导入的目标在全局作用域中可用。

(5)< moduleSpec >

  • 每个< moduleSpec >可以是裸模块名,也可以是带有版本约束的模块名(支持运算符=、<、>、<=和>=)。以下是具有各种约束的名为foo的模块的示例:
    • Foo匹配任何版本。
    • Foo <2只匹配2之前的版本。
    • Foo >=3.1匹配3.1或更高版本的任何版本。
    • Foo =1.2.3要求Foo必须是1.2.3版本。

(6)返回值
返回时可以设置以下变量。存在两组值:一组用于普通情况(< 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:其他编译器标志
< YYY > _VERSION:模块版本
< YYY > _PREFIX:模块的前缀目录
< YYY > _INCLUDEDIR:包含模块的目录
< YYY > _LIBDIR:模块的Lib目录

例子:

pkg_check_modules(ffmpeg REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil)

target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::ffmpeg)

例子:

pkg_check_modules (GLIB2 glib-2.0)

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

pkg_check_modules (GLIB2 glib-2.0>=2.10)

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

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

查找glib2-2.0(至少2.10版本)和gtk2±2.0的任何版本。只有当两者都被找到时,才会认为FOO被找到。FOO_glib-2.0_VERSION和FOO_gtk±2.0_VERSION变量将被设置为它们各自找到的模块版本。

pkg_check_modules (XRENDER REQUIRED xrender)

这句话的意思是“你可以去路径中找xrender这个库,任何版本都可以”。如果能够找到,那么就会设置宏XRENDER_LIBRARIES,XRENDER_STATIC_LIBRARIES。举个例子 :

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

pkg_search_module

此命令的行为与pkg_check_modules()相同,不同之处是它只搜索第一个成功匹配的模块,而不是检查所有指定的模块。

pkg_search_module(<prefix>
                  [REQUIRED] [QUIET]
                  [NO_CMAKE_PATH]
                  [NO_CMAKE_ENVIRONMENT_PATH]
                  [IMPORTED_TARGET [GLOBAL]]
                  <moduleSpec> [<moduleSpec>...])

3.16新版功能:如果找到一个模块,< prefix >_MODULE_NAME变量将包含匹配模块的名称。如果需要运行pkg_get_variable(),可以使用这个变量。

例子:

pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2)

pkg_get_variable

3.4新版功能。

检索pkg-config变量varName的值,并将其存储在调用范围内的结果变量resultVar中。

pkg_get_variable(<resultVar> <moduleName> <varName>)

如果pkg-config返回指定变量的多个值,resultVar将包含一个;-list。

例如:

pkg_get_variable(GI_GIRDIR gobject-introspection-1.0 girdir)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake:pkg_check_modules 的相关文章

  • 如何在 CLion 中运行 SFML,错误未定义引用?

    我是 C 新手 尝试学习游戏编程 我选择 SFML 并在 Jetbrain 的 CLion 上运行并使用 Ubuntu 机器 我按照这个教程SFML 和 Linux http sfml dev org tutorials 2 0 start
  • Android Studio 中的多个本机模块

    我有一个当前在 Visual Studio 中设置的 C 代码库 在 Windows 上运行 其中包含多个具有相互依赖关系的项目 我正在尝试将其转移到 Android Studio 以使其在 Android 上运行 我熟悉 Visual S
  • CMake不知道Qt4 qmake在哪里

    我正在使用 Debian 操作系统 我试图指出 cmake 我的 Qt4 在哪里 我尝试构建 qjson 库及其 CMakeLists txt http pastebin com fKNp0Qgy http pastebin com fKN
  • 在cmake中设置boost的最低版本

    我想定义系统上可用的最低增强版本 我尝试了以下方法 不幸的是 这不起作用 因为它尝试在系统上仅提供 boost 1 40 0 的情况下进行编译 SET Boost USE STATIC LIBS OFF SET Boost USE MULT
  • CMake FindThreads.cmake 找不到我的 pthreads.h 标头

    我在用着android cmake http code google com p android cmake 编译 Android 应用程序 这实质上创建了一个 CMake 工具链文件 用于使用 Android NDK 提供的工具链 As
  • CMake:执行宏/函数作为add_custom_command的命令

    我正在使用一个外部库 它提供了用于自动代码生成的 CMake 函数 以在我的 CMakeLists 中使用 问题是 每当我修改 CMakeLists 时 该函数都会再次运行 从而触发新生成但未更改的源的重新编译 我需要像 add custo
  • CMake 库安装最佳实践

    我正在尝试使用 cmake 为共享库安装脚本 当我发现我想使用install 我不确定设置目的地的最佳做法是什么 此评论 https stackoverflow com a 10928305 258418 and various https
  • 如何将 CMake 输出保存到文件?

    我通常可以通过以下方式保存 bash 命令的输出 gt gt output file txt 但是当我执行时cmake输出仍然发送到屏幕而不是预期的输出文件 cmake D CMAKE BUILD TYPE RELEASE D CMAKE
  • Visual Studio 将新文件放入错误的目录

    我使用 cmake 和 Visual Studio 并具有以下目录结构 workspace CMakeLists txt project1 src project2 src build 这背后的想法是源外构建 以便 cmake 生成的构建文
  • 调用always_inline‘_mm_mullo_epi32’时内联失败:目标特定选项不匹配

    我正在尝试使用 cmake 编译 C 程序 该程序使用 SIMD 内在函数 当我尝试编译它时 出现两个错误 usr lib gcc x86 64 linux gnu 5 include smmintrin h 326 1 错误 调用alwa
  • 将 CMake 变量从 GUI 导出到命令行

    是否可以将 CMake GUI 中设置的所有变量值导出到单个命令行字符串 以便可以从外部工具快速使用它 所以输出会是这样的 cmake DVar1 ON DVar2 foo 你可以从 Tools gt Show My Changes
  • 如何检测当前作用域在 CMake 中是否有父作用域?

    有什么方法可以检测当前作用域是否有父作用域 我有一个项目 可以是独立项目 也可以是另一个项目的子项目 为了允许子项目情况 我使用 PARENT SCOPE 标志来 set 将内容推送到父项目 但是 当构建为独立项目时 我收到 当前范围没有父
  • cmake 发现错误的 python 库

    我是 CMake 新手 无法理解一些使用概念 我正在从 C 程序调用 python 脚本 include
  • VS 2015 命令提示符中不再找到 rc.exe

    我刚刚安装了 Windows 10 创意者更新 版本 10 0 15063 我安装了多个版本的 Visual Studio 2012 2013 2015 和 2017 我几周前才安装了 VS 2017 Problem CMake 版本 3
  • CMake:不支持的 GNU 版本 - 不支持高于 8 的 gcc 版本

    在降级我的 GCC 之前 我想知道是否有一种方法可以确定我的机器中的哪些程序 框架或依赖项将被破坏 以及是否有更好的方法来安装 openpose 例如 更改 CMake 中的某些内容 有没有办法可以解决这个问题 而无需更改我的系统 GCC
  • cmake:在 CMakeLists.txt 中选择生成器

    我想强制CMake使用 Unix Makefiles 发电机来自 CMakeLists txt 中 这是我现在使用的命令 cmake G Unix Makefiles 我希望是这样的 cmake 当在安装了 VC 和自定义工具链的 Wind
  • CMake 64 位和 SFML 64 位

    我正在尝试使用适用于 Windows 的 CMake 64 位和 SFML 2 5 1 64 位构建 C 项目 当我在项目上运行 cmake 时 我收到一条错误消息 我能让它工作的唯一方法是改变CMAKE PREFIX PATH指向 SFM
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM

随机推荐

  • 北航2系921 2021考研历年真题及参考答案(2020-2004)

    需要自取 百度网盘 提取码 xff1a iwbg 关于2020北航921试题 相信大家都听说了 xff0c 2020年的921试题整体难度较2019年小 2019考完后 xff0c 群里面怨声载道 xff0c 信号10年没考电路题了怎么就今
  • 姿态解算

    姿态解算全过程 关于这方面 xff0c 姿态计算的理解大致需要经过以下几个步骤 1 秦永元的 惯性导航 xff0c 不但十分基础而且写的也十分好 xff0c 适合入门 但是并不是所有章节都是需要看的 xff0c 其中1 2节 9 2节和9
  • 匿名飞控代码解读汇总

    由于本人临近毕业 xff0c 所做的毕设是有关无人机方面的 xff0c 所使用的也是匿名的飞控 lt 资料包 20171217 gt xff0c 所以首先需要读懂匿名代码然后才能增加自己的功能 xff0c 临近毕业还有两个月左右 xff0c
  • 融合磁力计的Mahony互补滤波算法

    https blog csdn net qq 21842557 article details 50993809 上面博客有关于磁力计的详细解释 xff0c 不过由于本人资质愚钝 xff0c 至今还不是完全理解 不过思想大致和加速度计差不多
  • 代码解读一 文件名“ANO_Imu.c”

    我把这个文件的所有代码贴上来了 xff0c 供大家参考 xff0c 由于本人水平有限 xff0c 且匿名代码注释比较少 xff0c 所以很多也不是很懂 xff0c 实在是一些莫名的定义太多了 xff0c 什么w x y z h之类的 xff
  • 每周学一点 egret(2): EgretConversion 工具转换ts

    今晚无聊试了一下wing的格式化和这个转换工具 开始的时候我尝试手写翻译 xff0c 发现这一款转换也比较简单 所以尝试做了一下转换 对于如果文件名是中文 要小心一点 总是出现怪怪的 转换后 xff0c 没有直接跳转到对于的目录去 如果加上
  • 代码解读二 文件名“Ano_Math.c”

    这里面都是一些关于数学函数的骚操作 xff0c 既然不使用math h xff0c 那么至少说明这里面的数学函数调用不应比math h里面的函数慢 下面贴出代码 xff0c 简要做了个注释 xff0c 看看就行 至于怎么做的 xff0c 有
  • 关于单级PID及串级PID

    简单记录下我在学习PID过程中遇到的困难及解决方法 xff0c 希望能对大家有所帮助 1 首先 xff0c 关于PID这块理论知识必须非常清楚 xff0c 能够自行推导公式 xff0c 包括位置式PID公式和增量式PID公式 2 实现位置式
  • 代码解读三 文件名“Ano_Pid.c”

    关于PID这部分匿名代码里面有很多 xff0c 此文件是最基础的即单级PID的实现 xff0c 后面的关于速度和角速度环的串级PID及高度和高度速度环的串级PID都是以此为基础的 xff0c 所以此文件内容务必搞懂 C COPYRIGHT
  • 代码解读四 文件名“Ano_AttCtrl.c”

    这部分是关于匿名串级PID的 xff0c 我觉得有需要的同学可以直接移植 xff0c 不需要自己写了 xff0c 确实有点麻烦 xff0c 基本上代码里面都注释的很清楚了 xff0c 且由于本人水平有限 xff0c 所以也不是都很懂 xff
  • 代码解读六 文件名“Ano_AltCtrl.c”

    写了一大堆 xff0c 也不知道对不对 xff0c 贴上来让大家看看 include 34 Ano AltCtrl h 34 高度控制 include 34 Ano Imu h 34 include 34 Drv icm20602 h 34
  • 代码解读五 文件名“Ano_LocCtrl.c”

    关于这个位置速度环我还不是很理解 xff0c 因为单凭这一个文件确实看不出来什么东西 xff0c 这并不像角度环和角速度环一样有丰富的理论支撑 xff0c 至少我现在还没看到 xff0c 可能是我水平不够额 xff0c 但这并不妨碍我们继续
  • 代码解读七 文件名“Ano_MotorCtrl.c

    本文件比较简单 xff0c 代码比较少 xff0c 主要涉及解锁后四个电机依次1 2 3 4转动 xff0c 然后四轴也不会飞 xff0c 只是在原地轻微转动 xff0c 随后需要逐渐加油门至50 到达临界点 xff0c 稍微往上推一点 x
  • 代码解读八 文件名“Ano_FlightCtrl.c”

    这个文件代码有点乱啊 xff0c 反正没怎么看懂 xff0c 涉及到一键起飞和降落 xff0c 以及关于不同任务对应不同的灯光的切换 而且注释也还可以 xff0c 凑活着看下呗 xff0c 其实这个并不是什么关键文件 xff0c 看不懂就算
  • 代码解读九 文件名“Ano_MagProcess.c”

    本部分主要是关于磁力计进行校准操作的 xff0c 用户手册上有详细步骤 xff0c 有需要可以看看 include 34 Ano MagProcess h 34 include 34 Drv LED h 34 本文件是关于磁力计校准及相关处
  • 代码解读十 文件名“Ano_FlightDataCal.c”

    本部分主要是对IMU测量模块测量的值进行后续处理 xff0c 同时在飞行过程中不断对数据进行更新 xff0c 然后进行姿态解算 xff0c 便于后续丢进PID中进行进一步处理 根据所处位置及函数调用情况不难发现此部分算是对底层的进一步封装
  • 【阅读笔记】联邦学习实战——联邦学习攻防实战

    联邦学习实战 联邦学习攻防实战 前言1 后门攻击1 1 问题定义1 2 后门攻击策略1 3 详细实现 2 差分隐私2 1 集中式差分隐私2 2 联邦差分隐私2 3 详细实现 3 模型压缩3 1 参数稀疏化3 1 1 详细实现3 1 2 实验
  • 关于后续部分

    关于算法这块基本上算是读完了 xff0c 只能从大致上理解下了 xff0c 毕竟代码不是自己写的没有最直接的感受 xff0c 那么我们来回顾下 xff0c 试着从整体上来理解下匿名代码除了最上层之外的部分 最上层也就是包含main c在内的
  • cmake:设置编译选项

    此文为 xff1a 轻松入门cmake系列教程 常用 1 cmake debug和release设置 span class token macro property span class token directive hash span
  • cmake:pkg_check_modules

    此文为 xff1a 轻松入门cmake系列教程 理论 是什么 xff1f pkg check modules是 CMake 自己的 pkg config 模块的一个用来简化的封装 xff1a 你不用再检查 CMake 的版本 xff0c 加