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

当find_package无法找到第三方库时,可以使用pkgconfig结合.env配置来查找库路径和头文件路径。pkgconfig通过阅读.pc文件提供库信息,包括库路径、头文件路径等,并能创建IMPORTED_TARGET供target_link_libraries使用。文章详细介绍了pkg_check_modules的用法及不同参数含义。

如果第三方库无法使用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目录;
### 在C++ Qt项目中使用和集成第三方库C++ Qt项目中集成第三方库是提高开发效率和功能丰富性的重要手段。Qt支持多种方式集成第三方库,包括使用CMake、qmake、pkg-config和vcpkg等工具。这些工具不仅简化了的集成过程,还增强了应用程序的性能和用户体验[^1]。 #### 使用CMake集成第三方库 CMake是一种跨平台的构建系统生成工具,广泛用于Qt项目中管理依赖项。通过CMakeLists.txt文件,可以指定第三方库路径和链接方式。以下是一个简单的CMakeLists.txt示例,展示如何链接一个第三方库: ```cmake cmake_minimum_required(VERSION 3.14) project(MyQtProject) set(CMAKE_CXX_STANDARD 17) find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets) add_executable(MyQtProject main.cpp mainwindow.cpp) target_link_libraries(MyQtProject PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) # 链接第三方库 find_library(MYLIB_LIBRARY NAMES mylib PATHS /path/to/mylib) if(MYLIB_LIBRARY) target_link_libraries(MyQtProject PRIVATE ${MYLIB_LIBRARY}) endif() ``` #### 使用qmake集成第三方库 qmake是Qt自带的构建工具,适用于中小型项目。通过.pro文件配置第三方库路径和链接方式。以下是一个简单的.pro文件示例: ```qmake QT += core gui widgets TARGET = MyQtProject TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp # 链接第三方库 LIBS += -L/path/to/mylib -lmylib ``` #### 使用pkg-config集成第三方库 pkg-config是一个帮助管理依赖的工具,适用于Linux平台。通过pkg-config可以自动获取的编译和链接参数。以下是一个使用pkg-config的CMakeLists.txt示例: ```cmake find_package(PkgConfig REQUIRED) pkg_check_modules(MYLIB REQUIRED mylib) include_directories(${MYLIB_INCLUDE_DIRS}) target_link_libraries(MyQtProject PRIVATE ${MYLIB_LIBRARIES}) ``` #### 使用vcpkg集成第三方库 vcpkg是微软开发的一个C++管理工具,支持跨平台。通过vcpkg可以轻松安装和管理第三方库。安装vcpkg后,可以通过以下命令安装: ```bash vcpkg install mylib ``` 然后在CMakeLists.txt中集成vcpkg: ```cmake set(CMAKE_TOOLCHAIN_FILE "/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake") ``` #### 集成Matlab与Qt 在某些科学计算或数据分析场景中,Qt与Matlab的结合可以提供更强大的功能。通过使用第三方库,如Matlab的C++ API,可以实现Qt与Matlab的集成。以下是一个简单的示例,展示如何调用Matlab引擎: ```cpp #include <engine.h> #include <mex.h> void callMatlabFunction() { Engine *ep = engOpen(""); if (ep == nullptr) { // 处理错误 return; } engEvalString(ep, "result = myMatlabFunction();"); mxArray *result = engGetVariable(ep, "result"); // 处理结果 mxDestroyArray(result); engClose(ep); } ``` 通过上述方法,开发者可以灵活地在Qt项目中集成第三方库,提升开发效率和功能丰富性。每种方法都有其适用场景,选择合适的工具可以显著提高项目的可维护性和可扩展性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值