CMake中如何让头文件库关联的Find*.cmake信息传递给下游项目
方案1:将自定义FindB.cmake随库A的配置文件一同分发(最稳妥,推荐)
问题的核心原因是你在库A构建时设置的CMAKE_MODULE_PATH仅对A的构建上下文生效,下游项目引用A时,运行AConfig.cmake的上下文没有包含A自带FindB.cmake的路径,因此找不到模块文件。
操作步骤:
- 修改库A的根
CMakeLists.txt,添加安装规则将FindB.cmake和A的官方配置文件放到同一路径:
install(FILES "${PROJECT_SOURCE_DIR}/cmake/FindB.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/A")
- 修改
AConfig.cmake.in,在调用find_dependency前临时将当前配置文件所在目录加入CMAKE_MODULE_PATH,查找完成后可以可选移除路径避免污染下游的构建配置:
include(CMakeFindDependencyMacro) # 将当前AConfig.cmake所在目录加入模块查找路径,定位自带的FindB.cmake list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") find_dependency(B REQUIRED) # 可选:移除刚才添加的路径,不影响下游自己的CMAKE_MODULE_PATH配置 list(POP_BACK CMAKE_MODULE_PATH)
这个方案完全不需要下游做任何额外配置,find_package(A)就可以自动完成所有依赖解析。
方案2:直接导出B的目标信息到A的配置中(仅适合固定路径依赖场景)
如果你确定库B的安装路径在所有使用A的设备上都和你构建A时的路径一致,可以直接将B的导入目标导出到A的目标配置里,不需要下游再执行find_dependency(B):
在库A的install(EXPORT)语句中添加EXPORT_IMPORTED_TARGETS B::B参数,示例:
install(EXPORT ATargets FILE ATargets.cmake NAMESPACE A:: EXPORT_IMPORTED_TARGETS B::B DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/A")
⚠️ 注意:这个方案兼容性很差,如果B的路径在下游设备上有变化会直接链接失败,非特殊场景不推荐使用。
内容的提问来源于stack exchange,提问作者aabceh
相关产品推荐
相关产品推荐

