如何构建包含两个有依赖关系子项目的CMake聚合项目
解决方案说明
不需要使用ExternalProject_Add,该指令适用于无法直接纳入主构建树的外部依赖,会触发独立构建流程,反而增加不必要的复杂度,你的场景使用CMake原生聚合构建能力即可解决,根据你是否能修改子项目配置,可选择以下两种方案:
方案1:可修改子项目配置(长期推荐)
你需要先把sub_prj0改造为符合CMake包规范的项目,使其构建时就能生成包配置文件,无需安装即可被find_package识别:
- 在
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\") ") - 修改根目录
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
相关产品推荐
相关产品推荐

