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

如何构建包含两个有依赖关系子项目的CMake聚合项目

解决方案说明

不需要使用ExternalProject_Add,该指令适用于无法直接纳入主构建树的外部依赖,会触发独立构建流程,反而增加不必要的复杂度,你的场景使用CMake原生聚合构建能力即可解决,根据你是否能修改子项目配置,可选择以下两种方案:


方案1:可修改子项目配置(长期推荐)

你需要先把sub_prj0改造为符合CMake包规范的项目,使其构建时就能生成包配置文件,无需安装即可被find_package识别:

  1. 在sub_prj0/CMakeLists.txt末尾添加目标导出配置:
    # 示例假设sub_prj0是你定义的库目标,可替换为实际目标名
    install(TARGETS sub_prj0
      EXPORT sub_prj0Targets
      LIBRARY DESTINATION lib
      ARCHIVE DESTINATION lib
      RUNTIME DESTINATION bin
      INCLUDES DESTINATION include
    )
    
    # 生成构建树用的目标导出文件
    export(EXPORT sub_prj0Targets
      FILE "${CMAKE_CURRENT_BINARY_DIR}/sub_prj0Targets.cmake"
      NAMESPACE sub_prj0::
    )
    
    # 生成包配置文件(也可通过configure_package_config_file生成正式版)
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sub_prj0Config.cmake" "
      include(\"${CMAKE_CURRENT_BINARY_DIR}/sub_prj0Targets.cmake\")
    ")
    
  2. 修改根目录CMakeLists.txt,添加sub_prj0后显式指定包查找路径:
    add_subdirectory(sub_prj0)
    # 强制指定sub_prj0的包配置路径,优先级高于系统路径
    set(sub_prj0_DIR "${CMAKE_CURRENT_BINARY_DIR}/sub_prj0" CACHE PATH "" FORCE)
    add_subdirectory(sub_prj1)
    

此时sub_prj1中的find_package(sub_prj0)会直接命中本地构建的sub_prj0目标,不会去系统路径扫描。


方案2:无法修改子项目配置(快速适配)

如果你使用CMake 3.24及以上版本,可以直接用add_subdirectory新增的OVERRIDE_FIND_PACKAGE参数,直接接管find_package的查找逻辑,无需修改任何子项目配置:
修改根目录CMakeLists.txt如下:

add_subdirectory(sub_prj0 OVERRIDE_FIND_PACKAGE)
add_subdirectory(sub_prj1)

该参数会自动生成对应包的占位配置,后续所有find_package(sub_prj0)调用都会直接返回当前子项目的目标,完全跳过系统查找流程。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:39:03