CMake中add_subdirectory后使用find_package加载失败的问题如何解决
问题根因
你遇到的报错是因为MyLibTargets.cmake仅会在执行CMake安装步骤时生成,而你在执行find_package时还未完成MyLib的安装流程,且未配置构建目录下的目标导出规则。
遗漏的配置项
- 缺少构建目录的目标导出规则
你当前只配置了安装时的导出逻辑,需要在MyLib的CMakeLists.txt中新增构建目录的导出命令,放在install(EXPORT MyLibTargets ...)之前即可:
export(EXPORT MyLibTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/MyLibTargets.cmake" NAMESPACE MyLib:: )
该命令会在MyLib的构建目录下直接生成MyLibTargets.cmake,无需执行安装步骤即可被顶层项目找到。
- 可选:调整find_package查找路径(如果需要沿用安装目录结构)
如果你希望保持安装逻辑的路径结构,不需要构建目录导出,需要将顶层CMakeLists.txt中find_package的HINTS参数调整为:
find_package(MyLib CONFIG REQUIRED HINTS ${CMAKE_CURRENT_BINARY_DIR}/extern/MyLib/lib/cmake/MyLib)
同时你需要先单独执行MyLib的安装步骤,再执行顶层项目的配置流程。
- 检查MyLibConfig.cmake.in的路径配置
确保你的MyLibConfig.cmake.in中是通过${CMAKE_CURRENT_LIST_DIR}来定位MyLibTargets.cmake,示例写法如下:
include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake")
不要写死绝对路径,避免不同环境下查找失败。
可选优化方案
因为你已经通过add_subdirectory将MyLib引入了当前构建树,其实无需调用find_package,直接在需要链接MyLib的目标中使用target_link_libraries(你的目标 PRIVATE MyLib::MyLib)即可,不需要额外配置导出逻辑。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

