如何避免已配置的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
相关产品推荐
相关产品推荐

