You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在CMake构建的C++项目中集成第三方依赖库?

嘿,我来给你分享几种把已安装的第三方库集成到CMake构建的C++项目里的实用方案,你可以根据库的类型和你的需求来选:

方案1:用CMake FetchContent模块(首推,适配支持CMake的库)

这个模块能帮你直接从源码仓库拉取第三方库的代码,在你的项目构建过程中自动编译并集成,完全摆脱对系统已安装版本的依赖,还能保证团队成员用的是同一个版本的库,避免环境不一致的问题。

举个例子,假设你要集成的是fmt库,在你的根CMakeLists.txt里这么写:

# 引入FetchContent模块
include(FetchContent)

# 声明要拉取的库
FetchContent_Declare(
  fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG 9.1.0  # 指定你需要的版本标签
)

# 让CMake下载、编译并导入这个库
FetchContent_MakeAvailable(fmt)

# 然后在你的目标里链接这个库
add_executable(your_project main.cpp)
target_link_libraries(your_project PRIVATE fmt::fmt)

这样一来,每次构建项目时,CMake会自动检查fmt库是否已经下载编译,如果没有就帮你搞定,完全不用手动去安装。

方案2:用ExternalProject模块(适配复杂构建场景)

如果你的第三方库不支持CMake构建,或者你需要对它的编译过程做更多自定义配置,ExternalProject就是个不错的选择。它会单独处理第三方库的构建流程,然后让你的项目链接到编译好的库文件。

比如集成一个自定义的非CMake库:

include(ExternalProject)

# 定义外部项目
ExternalProject_Add(
  third_party_lib
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/your_lib  # 如果你已经把源码放到项目里了,就指定这个路径;也可以用URL拉取远程源码
  CONFIGURE_COMMAND ../your_lib/configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/third_party_install  # 自定义配置命令
  BUILD_COMMAND make
  INSTALL_COMMAND make install
)

# 导入编译好的库
add_library(your_lib STATIC IMPORTED)
set_target_properties(your_lib PROPERTIES
  IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/third_party_install/lib/libyourlib.a
  INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR}/third_party_install/include
)

# 确保你的项目在第三方库编译完成后再构建
add_dependencies(your_project third_party_lib)
target_link_libraries(your_project PRIVATE your_lib)
方案3:直接拷贝库文件到项目目录(简单粗暴,适合小型库)

如果你的第三方库体积不大,或者你不想折腾源码构建,直接把库的头文件和预编译的库文件拷贝到项目目录里就行。

步骤大概是:

  1. 在项目根目录新建third_party/includethird_party/lib文件夹
  2. 把第三方库的头文件全部放到include里,静态库(比如libxxx.a)或动态库(比如libxxx.so/xxx.dll)放到lib
  3. 在CMakeLists.txt里配置路径:
# 添加头文件路径
target_include_directories(your_project PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/include)

# 添加库文件路径
target_link_directories(your_project PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/lib)

# 链接库
target_link_libraries(your_project PRIVATE xxx)  # 这里的xxx是库名,比如libfmt.a就写fmt

一些额外提醒

  • 如果是动态库,记得在分发项目的时候把动态库文件一起打包,不然运行时会找不到库
  • 静态库的话,要确保它的编译选项(比如C++标准、编译优化等级)和你的项目一致,避免出现兼容性问题
  • 如果你之前依赖的是系统已安装的库,切换到集成方案后,最好清理一下CMake缓存(删除build目录重新生成),避免残留的旧配置影响构建

内容的提问来源于stack exchange,提问作者Asen Valchev

火山引擎 最新活动