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

如何避免已配置的FetchContent被CMake重复配置?

如何让FetchContent跳过已完成获取配置的库

当然可以,FetchContent本身具备缓存机制,通过手动控制状态检查就能避免重复获取和配置已完成的依赖库,具体做法如下:

手动控制跳过逻辑

替代FetchContent_MakeAvailable,改用FetchContent_GetProperties结合条件判断来实现精准控制:

# 处理fmt库
FetchContent_Declare(fmt GIT_REPOSITORY https://github.com/fmtlib/fmt)
FetchContent_GetProperties(fmt)
if(NOT fmt_POPULATED)
  FetchContent_Populate(fmt)
  add_subdirectory(${fmt_SOURCE_DIR} ${fmt_BINARY_DIR})
endif()

# 处理glfw库
FetchContent_Declare(glfw GIT_REPOSITORY https://github.com/glfw/glfw)
FetchContent_GetProperties(glfw)
if(NOT glfw_POPULATED)
  FetchContent_Populate(glfw)
  add_subdirectory(${glfw_SOURCE_DIR} ${glfw_BINARY_DIR})
endif()

原理说明

  • FetchContent_GetProperties会读取目标库的状态变量,比如fmt_POPULATED,该变量会标记该库是否已经完成了代码获取和初始配置。
  • 只有当变量值为FALSE时,才会执行FetchContent_Populate(拉取代码)和add_subdirectory(配置编译)操作;若已经完成,直接跳过后续步骤。

补充说明

默认情况下,FetchContent_MakeAvailable其实也会做类似的检查,但通过手动拆分步骤,你能更明确地控制跳过逻辑。已获取的库代码默认存放在构建目录下的_deps子文件夹中,只要该目录未被删除或修改,就不会重复执行获取和配置流程。

内容的提问来源于stack exchange,提问作者shashashamti2008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:12:29