【cmake】pkg_check_modules 使用详解

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3003

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
pkg_check_modules 主要通过 .pc 文件引入整个库,该下令会分析指定的 .pc 文件,并将所需的编译和链接信息提取到 CMake 变量中,以便后续使用。

目录
1、pkg_check_modules 的检索目录
2、pkg_check_modules 语法格式
3、应用:pkg_check_modules 引入 libavfilter.pc 
3.1 使用 IMPORTED_TARGETS
3.2 不使用 IMPORTED_TARGETS


1、pkg_check_modules 的检索目录

一样平常情况下,pkg_check_modules 会在默认路径(尺度路径)下寻找对应的 pc 文件,如 /usr/lib/pkgconfig、/usr/local/lib/pkgconfig,假如 .pc 文件位于非尺度位置,可以通过设置 PKG_CONFIG_PATH环境变量来告诉 pkg-config 查找 .pc 文件的路径。
  1. # ffmpeg 的pc文件位置:${PROJECT_SOURCE_DIR}/3rdparty/ffmpeg/lib/pkgconfig
  2. # 系统环境变量:PKG_CONFIG_PATH
  3. # 格式: set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:<pc文件位置>")
  4. set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${PROJECT_SOURCE_DIR}/3rdparty/ffmpeg/lib/pkgconfig")
复制代码

2、pkg_check_modules 语法格式

pkg_check_modules使用方法和 find_package 类似,根本语法如下:
  1. pkg_check_modules(<PREFIX> REQUIRED|QUIET|OPTIONAL [IMPORTED_TARGETS] <modules>...)
复制代码
①  <REFIX>
相当于为后续要引入的库起一个别名,这个别名会被用于多个地方,最典范的就是Cmake变量,头文件路径会被保存到  XXX_INCLUDE_DIRS,库文件路径会被保存到  XXX_LIB,而这里的 <REFIX> 则用于替换变量中的 XXX
② REQUIRED | QUIT | OPTIONAL
此处有三个可选项,每个可选项的意义如下:


  • REQUIRED:表示该软件包是必需的,假如找不到将会导致设置错误
  • QUIT:表示即使找不到也不会产生错误,只是输出一条告诫
  • OPTIONAL:表示查找不到软件包也不会产生错误,且不会输出任何信息。
③ [IMPORTED_TARGETS]
可选参数,指定是否应该为该软件包创建 IMPORTED 目标,假如指定了此参数,CMake 将会为该软件包创建一个 IMPORTED 目标,我们可以在后续的 CMake 文件中使用这个目标来链接该软件包。
主要表现在链接到目标文件的时候可以采用如下方式,下面的 <REFIX> 对应pkg_check_modules的第一个参数
  1. target_link_libraries(${PROJECT_NAME} PRIVATE
  2.     PkgConfig::<PREFIX>
  3. }
复制代码
④ modules
要查询的软件包名称,通常是在系统上安装的软件包的名字。假设要查找 libavcodec.pc 文件,那么这里填入的就是 libavcodec。pkg_check_modules一次可以查找多个pc文件,如
  1. pkg_check_modules(Avfilter REQUIRED IMPORTED_TARGET
  2.     libavcodec
  3.     libavdevice
  4.     libavfilter
  5. )
复制代码

3、应用:pkg_check_modules 引入 libavfilter.pc 

下面先容两种,一种是使用了 IMPORTED_TARGETS 选项,一种是不使用 IMPORTED_TARGETS选项。二者的区别在于链接到目标文件的方式差别,寻找 pc 文件的方式是几乎一样的。

3.1 使用 IMPORTED_TARGETS

寻找 pc 文件:
  1. # 添加检索路径
  2. set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${PROJECT_SOURCE_DIR}/3rdparty/ffmpeg/lib/pkgconfig")
  3. # 查找 pc 文件
  4. find_package(PkgConfig REQUIRED)
  5. pkg_check_modules(Avfilter REQUIRED IMPORTED_TARGET libavfilter) # 使用 IMPORTED_TARGETS
  6. if(Avfilter_FOUND)
  7.     message(STATUS "found avfilter")
  8.     message(STATUS "    - avfilter include directories: ${Avfilter_INCLUDE_DIRS}")
  9.     message(STATUS "    - avfilter libraries directories: ${Avfilter_LIBRARY_DIRS}")
  10.     message(STATUS "    - avfilter libraries: ${Avfilter_LIBRARIES}")
  11.     include_directories(${Avfilter_INCLUDE_DIRS})
  12.     link_directories(${Avfilter_LIBRARY_DIRS})
  13. else()
  14.     message(FATAL_ERROR "avfilter not found")
  15. endif()
复制代码
链接到目标文件:
  1. add_executable(${PROJECT_NAME} ${ALL_SRCS})
  2. target_link_libraries(${PROJECT_NAME} PRIVATE
  3.     PkgConfig::Avfilter      
  4. ) # 这里的Avfilter是pkg_check_modules的第一个参数
复制代码

3.2 不使用 IMPORTED_TARGETS

寻找 pc 文件
  1. # 添加检索路径
  2. set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${PROJECT_SOURCE_DIR}/3rdparty/ffmpeg/lib/pkgconfig")
  3. # 查找 pc 文件
  4. find_package(PkgConfig REQUIRED)
  5. pkg_check_modules(Avfilter REQUIRED libavfilter) # 不使用 IMPORTED_TARGETS
  6. if(Avfilter_FOUND)
  7.     message(STATUS "found avfilter")
  8.     message(STATUS "    - avfilter include directories: ${Avfilter_INCLUDE_DIRS}")
  9.     message(STATUS "    - avfilter libraries directories: ${Avfilter_LIBRARY_DIRS}")
  10.     message(STATUS "    - avfilter libraries: ${Avfilter_LIBRARIES}")
  11.     include_directories(${Avfilter_INCLUDE_DIRS})
  12.     link_directories(${Avfilter_LIBRARY_DIRS})
  13. else()
  14.     message(FATAL_ERROR "avfilter not found")
  15. endif()
复制代码
链接到目标文件:
  1. add_executable(${PROJECT_NAME} ${ALL_SRCS})
  2. target_link_libraries(${PROJECT_NAME} PRIVATE
  3.     ${Avfilter_LIBRARIES}
  4. )
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表