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

如何在CMake中仅构建Git子仓库another_repo的部分代码?

我来给你几个实用的方案,帮你在根目录的CMakeLists.txt里自定义构建another_repo的部分代码,完全绕过它自带的构建脚本:

方案1:直接在根脚本里编译指定源文件(最推荐)

这种方式完全掌控编译范围,不需要依赖子仓库的CMake配置,适合只需要子仓库一小部分代码的场景。

假设你只想编译another_repo里的src/core目录下的cpp文件,以及用到include目录的头文件,你可以在根CMakeLists.txt里这么写:

# 先添加子仓库的头文件搜索路径,让主项目能找到它的头文件
target_include_directories(your_main_project
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ext/another_repo/include
)

# 收集你需要的子仓库源文件(可以根据需求调整路径)
file(GLOB_RECURSE ANOTHER_REPO_SELECTED_SOURCES
    ${CMAKE_CURRENT_SOURCE_DIR}/ext/another_repo/src/core/*.cpp
    # 要是还需要其他文件,继续在这里添加路径就行
)

# 把选中的源文件编译成静态库(也可以改成SHARED生成动态库)
add_library(another_repo_custom STATIC ${ANOTHER_REPO_SELECTED_SOURCES})

# 让主项目链接这个自定义编译的库
target_link_libraries(your_main_project PRIVATE another_repo_custom)

优点:完全自主控制编译内容,不用管子仓库的复杂配置;缺点:如果子仓库有第三方依赖,你得自己手动处理这些依赖的链接和编译选项。

方案2:用自定义CMake脚本替代子仓库的配置

如果你习惯用CMake的子目录结构管理,不想把所有逻辑都堆在根脚本里,可以单独写一个自定义的CMakeLists,然后指向它。

  1. 先在根目录创建一个cmake/another_repo文件夹,里面放你的自定义CMakeLists.txt,内容示例:
# 定义子仓库的根路径
set(ANOTHER_REPO_ROOT ${CMAKE_CURRENT_LIST_DIR}/../../ext/another_repo)

# 设置头文件路径
target_include_directories(another_repo_custom
    PUBLIC ${ANOTHER_REPO_ROOT}/include
)

# 收集需要编译的源文件
file(GLOB_RECURSE ANOTHER_REPO_SOURCES
    ${ANOTHER_REPO_ROOT}/src/core/*.cpp
)

# 生成库
add_library(another_repo_custom STATIC ${ANOTHER_REPO_SOURCES})
  1. 然后在根CMakeLists.txt里添加:
# 添加自定义的子目录脚本,而不是子仓库自带的那个
add_subdirectory(cmake/another_repo)

# 链接到主项目
target_link_libraries(your_main_project PRIVATE another_repo_custom)

优点:保持了CMake的模块化结构,自定义脚本可以单独维护;缺点:需要注意自定义脚本和子仓库源码的路径相对关系,避免路径出错。

方案3:临时覆盖子仓库的CMakeLists(不推荐)

如果只是临时测试,不想折腾复杂的路径配置,可以把你的自定义脚本复制到子仓库目录,覆盖它自带的CMakeLists。不过这种方法会修改子仓库的文件,容易搞乱Git状态,只适合临时场景:

# 假设你的自定义脚本在根目录的custom_another_repo.cmake
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/custom_another_repo.cmake
    ${CMAKE_CURRENT_SOURCE_DIR}/ext/another_repo/CMakeLists.txt
    COPYONLY
)

# 现在调用add_subdirectory就会用你的自定义脚本了
add_subdirectory(ext/another_repo)

⚠️ 注意:这种方法会修改Git子模块里的文件,提交代码时一定要注意不要把修改后的CMakeLists提交到子模块仓库里。

额外小提示

尽量用target_include_directories代替全局的include_directories,这样更符合CMake的现代用法,能避免头文件路径污染;如果子仓库有编译选项要求(比如C++标准、宏定义),记得在自定义构建脚本里加上对应的target_compile_options或者target_compile_definitions。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:07:35