如何引用含有pkgconfig的第三方库

16 篇文章 0 订阅

如果第三方库无法使用find_package来找到(有可能是第三方库没设置好或者没有Findxxx.cmake等,但是有pkgconfig目录,有.pc文件),此时通过pkgconfig也能找到库路径以及头文件路径(虽然可以直接通过find_library的方式来找,但是总感觉别人都提供了,为啥不用别人提供的呢,哈哈)

# 首先设置pkgconfig环境变量路径(路径必须包含对应的*.pc文件,少一层路径都不行):
# 如果有多个路径,可以使用";"
set(ENV{PKG_CONFIG_PATH} "/opt/glog/glog_arm_gcc9/lib/pkgconfig")

# 使用find_package来找pkgconfig
find_package(PkgConfig REQUIRED)

#获取库变量前缀,这个MYLIBS会是后面各个路径的前缀,libglog是库文件的pc文件中的名称
pkg_check_modules(MYLIBS REQUIRED libglog)

message(STATUS "${MYLIBS_FOUND}" # 是否搜索到此库
message(STATUS "${MYLIBS_INCLUDE_DIRS}" # 头文件路径
message(STATUS "${MYLIBS_LINK_LIBRARIES}" # 库文件完整路径

在这里插入图片描述

pkg_check_modules的用法:
pkg_check_modules原文链接

pkg_check_modules(<prefix>
                  [REQUIRED] [QUIET]
                  [NO_CMAKE_PATH]
                  [NO_CMAKE_ENVIRONMENT_PATH]
                  [IMPORTED_TARGET [GLOBAL]]
                  <moduleSpec> [<moduleSpec>...])
  • REQUIRED表示找不到就报错停止;
  • QUIET即使找不到也不报错停止;
  • NO_CMAKE_PATHNO_CMAKE_ENVIRONMENT_PATH就是指定不包含默认的一些路径,还有其他路径设置可以从原文链接里看;
  • IMPORTED_TARGET 表示要输出一个target,可以直接用于target_link_libraries()函数中,比如:
    pkg_check_modules(MYLIBS REQUIRED IMPORTED_TARGET lib_name)
    
    # 也就是不需要直接获取库的路径变量,直接将路径变量变成了PkgConfig::MYLIBS这个target,
    # 直接依赖即可
    target_link_libraries(main PkgConfig::MYLIBS)
    
  • GLOBAL表示上述的IMPORTED_TARGET 输出的target是不是全局的;

如果后面跟的模块有多个,也就是有多个lib,都找到才算找到。比如:

# 要找到多个lib库,libavcodec libavformat libavutil都找到才算真的找到
pkg_check_modules(ffmpeg REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil)

另外,上述的moduleSpec可以设置版本,比如:

# 表示搜索到任意版本的lib_name都行
pkg_check_modules(MYLIBS REQUIRED IMPORTED_TARGET lib_name)

# 表示搜索到的库的版本号必须大于1.2.3
pkg_check_modules(MYLIBS REQUIRED IMPORTED_TARGET lib_name=1.2.3)

# 表示只匹配1.2版本之前的版本
pkg_check_modules(MYLIBS REQUIRED IMPORTED_TARGET lib_name<1.2)

# 表示只匹配1.2以及之后的版本
pkg_check_modules(MYLIBS REQUIRED IMPORTED_TARGET lib_name>=1.2)

此函数执行成功后,会返回哪些变量:

  • <XXX>_FOUND:如果找到,则此值为1;
  • <XXX>_LIBRARIES:找到的库名称,不包含路径,如glog
  • <XXX>_LINK_LIBRARIES:包含完整路径的库名称,如/opt/lib/libglog.a
  • <XXX>_LIBRARY_DIRS:库路径,不包含名称;
  • <XXX>_LDFLAGS:所需要的链接选项,如-L/opt//lib;-lglog
  • <XXX>_LDFLAGS_OTHER:其他链接选项;
  • <XXX>_INCLUDE_DIRS:头文件路径;
  • <XXX>_CFLAGS:C或C++编译参数;
  • <XXX>_CFLAGS_OTHER:其他C或C++编译参数;
  • <YYY>_VERSION:实际找到的版本号;
  • <YYY> _PREFIX:模块的前缀目录;
  • <YYY> _INCLUDEDIR:包含模块的目录;
  • <YYY> _LIBDIR:模块的Lib目录;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值