CMake多组件仓库配置问题:find_package(Base COMPONENTS Utils)无法找到Base::Utils目标
CMake多组件仓库配置问题:find_package(Base COMPONENTS Utils)无法找到Base::Utils目标
看起来你的问题出在BaseConfig.cmake.in的配置逻辑和顶层CMakeLists的导出处理上,我来一步步帮你排查和修复:
1. 移除BaseConfig.cmake.in中的错误install命令
你在BaseConfig.cmake.in里写的install(EXPORT BaseConfig...)是完全错误的——当其他项目执行find_package(Base)时,会运行这个配置文件里的代码,而install()是构建阶段专属命令,根本不能在导入阶段执行,这就是你看到INSTALL(EXPORT) given unknown export "BaseConfig"报错的直接原因。
删掉这几行代码:
# Install the export group install(EXPORT BaseConfig NAMESPACE Base:: DESTINATION cmake )
2. 让BaseConfig.cmake处理COMPONENTS参数,自动加载组件配置
原来的BaseConfig.cmake.in完全没处理find_package时传入的COMPONENTS参数,也就是说,哪怕你指定了Utils组件,Base的配置文件也不会去加载Utils的导出配置,自然找不到Base::Utils目标。
修改BaseConfig.cmake.in,添加组件处理逻辑:
@PACKAGE_INIT@ # 遍历用户请求的所有组件,加载对应组件的配置文件 foreach(component ${Base_FIND_COMPONENTS}) include("${CMAKE_CURRENT_LIST_DIR}/${component}Config.cmake") endforeach() # 验证所有请求的组件都已成功找到(可选但推荐) check_required_components(Base)
3. 确认组件导出路径的一致性
你的Utils组件已经正确将UtilsConfig.cmake安装到了cmake目录,顶层Base的configure_package_config_file也把BaseConfig.cmake安装到了同一个cmake目录,这点是没问题的——@PACKAGE_INIT@会自动帮你设置正确的路径,确保BaseConfig.cmake能找到同目录下的UtilsConfig.cmake。
最后验证步骤
- 删掉Base仓库的
build和install目录,重新执行构建安装命令:
cmake -G "MinGW Makefiles" .. && cmake --build . --target install
- 回到测试项目,重新执行CMake配置,这时候应该就能成功找到
Base::Utils目标,不会再报错了。
备注:内容来源于stack exchange,提问作者caffeine
相关产品推荐
相关产品推荐

