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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:18:01