如何在Git+CMake项目中规范引入Git/CMake外部库依赖?
Git+CMake项目添加外部库的标准优化方案
核心思路
完全利用依赖库自带的CMake配置,通过Git Submodules管理依赖版本,让CMake自动处理构建、链接和二进制文件复制,无需手动操作,且支持无缝更新依赖。
1. 用Git Submodules管理依赖
保持你当前的submodules方式,但确保配置正确:
- 在项目根目录创建
.gitmodules文件,示例:[submodule "vendors/boost"] path = vendors/boost url = https://github.com/boostorg/boost.git branch = master [submodule "vendors/openssl"] path = vendors/openssl url = https://github.com/openssl/openssl.git branch = master - 克隆项目时拉取所有submodules:
git clone --recurse-submodules <你的仓库地址> - 后续更新submodules:
git submodule update --remote --merge
2. 让CMake自动构建依赖库
在主项目的CMakeLists.txt中,直接用add_subdirectory引入依赖库,无需手动提前构建:
# 配置Boost只构建需要的模块(可选,加快构建速度) set(BOOST_INCLUDE_LIBRARIES system) set(BOOST_ENABLE_CMAKE ON) # 引入依赖库,EXCLUDE_FROM_ALL避免构建依赖库的所有默认目标 add_subdirectory(vendors/boost EXCLUDE_FROM_ALL) add_subdirectory(vendors/openssl EXCLUDE_FROM_ALL)
3. 自动链接依赖并处理二进制文件
直接使用依赖库提供的CMake目标链接主项目,同时添加POST_BUILD命令自动复制动态库到输出目录:
# 定义主项目目标 add_executable(MyProject src/main.cpp) # 链接依赖库的CMake目标(Boost和OpenSSL都提供了标准目标) target_link_libraries(MyProject PRIVATE Boost::system OpenSSL::Crypto OpenSSL::SSL ) # 自动复制Boost动态库到输出目录 add_custom_command(TARGET MyProject POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Boost::system> $<TARGET_FILE_DIR:MyProject> ) # 自动复制OpenSSL动态库 add_custom_command(TARGET MyProject POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:OpenSSL::Crypto> $<TARGET_FILE_DIR:MyProject> COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:OpenSSL::SSL> $<TARGET_FILE_DIR:MyProject> )
- 静态库无需复制,CMake会直接链接到可执行文件中;动态库会在每次构建主项目时自动复制,删除
bin目录后重新构建也会自动生成。
4. 在VS中直接查看依赖源码
用add_subdirectory引入后,CMake生成的VS解决方案会自动包含依赖库的项目,无需额外Premake配置:
- 打开VS解决方案后,在「解决方案资源管理器」中能看到
vendors目录下的依赖库项目,直接展开即可查看.cpp/.hpp文件。
5. 无缝更新依赖库
- 进入依赖库目录更新:
cd vendors/boost && git pull - 或在主项目根目录批量更新:
git submodule update --remote --merge - 更新后重新运行CMake(VS中右键项目→「CMake缓存→刷新缓存并重新生成」),CMake会自动重新构建更新后的依赖库,无需手动调整配置。
内容的提问来源于stack exchange,提问作者Vero
相关产品推荐
相关产品推荐

