You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:36:03