CMake如何一次性编译链接git子模块依赖库与主项目可执行文件
解决方案
核心实现逻辑
使用CMake内置的add_subdirectory()指令引入子模块的CMake工程,CMake会自动识别依赖顺序,先编译依赖库再编译主程序,无需手动分步骤编译。
根目录CMakeLists.txt完整配置
编辑/my_proj/CMakeLists.txt,内容如下:
# 声明要求的CMake最低版本,可根据你的实际环境调整 cmake_minimum_required(VERSION 3.10) # 声明主项目名称 project(my_proj) # 可选配置:指定C++标准版本,按你的项目需求调整 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 引入my_dep子模块的CMake工程 add_subdirectory(deps/my_dep) # 编译主程序可执行文件 add_executable(my_proj_exe src/main.cpp) # 将my_dep库链接到主程序,自动继承my_dep公开的头文件路径、编译参数 target_link_libraries(my_proj_exe PRIVATE my_dep)
依赖项my_dep的配置要求
- 需确保
deps/my_dep/CMakeLists.txt中已经正确定义了库目标,参考示例:
cmake_minimum_required(VERSION 3.10) project(my_dep) # 定义库目标,STATIC对应静态库.a,SHARED对应动态库.so add_library(my_dep STATIC src/my_dep.cpp) # 关键配置:公开my_dep的头文件目录,上层项目链接时无需额外配置头文件路径 target_include_directories(my_dep PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
- 如果你不想修改my_dep的原生CMake配置,也可以在主项目的CMakeLists.txt中手动添加头文件路径,在
target_link_libraries前插入如下行即可:
target_include_directories(my_proj_exe PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/deps/my_dep/include)
编译执行
如果首次拉取项目后子模块目录为空,先执行命令拉取子模块代码:
git submodule update --init --recursive
之后直接在项目根目录执行所需的单流程编译命令即可:
cd my_proj cmake . && make
CMake会自动按顺序完成my_dep库编译、主程序编译、库链接全流程。
内容的提问来源于stack exchange,提问作者AlessiaCorra
相关产品推荐
相关产品推荐

