如何让CMake FetchContent不引入Git仓库子模块?
如何在CMake FetchContent中禁止拉取Git子模块
你遇到的问题是CMake FetchContent默认拉取子模块,即使显式设置GIT_SUBMODULES ""也无效,以下是几个可靠的解决方法:
直接传递Git克隆参数:在
FetchContent_Declare中添加GIT_CLONE_FLAGS "--no-submodules",强制Git克隆时不包含任何子模块。这是最直接的方式,绕过CMake的子模块处理逻辑,直接给底层Git命令加参数:FetchContent_Declare( target_repo GIT_REPOSITORY https://github.com/example/target.git GIT_TAG v1.0.0 GIT_CLONE_FLAGS "--no-submodules" )结合双参数锁定子模块行为:如果上面的方法还不行,同时设置
GIT_SUBMODULES ""和GIT_SUBMODULE_RECURSE OFF,明确告知CMake既不拉取指定子模块,也不递归拉取:FetchContent_Declare( target_repo GIT_REPOSITORY https://github.com/example/target.git GIT_TAG v1.0.0 GIT_SUBMODULES "" GIT_SUBMODULE_RECURSE OFF )清理FetchContent缓存:如果之前已经拉取过包含子模块的版本,CMake会复用缓存目录。需要删除构建目录下的
_deps/target_repo-src和_deps/target_repo-build文件夹,然后重新运行CMake,确保新的配置生效。
注意:部分旧版本CMake(低于3.14)的FetchContent子模块处理逻辑可能存在bug,建议升级到CMake 3.14+版本,能更好地支持子模块控制参数。
内容的提问来源于stack exchange,提问作者dsaada
相关产品推荐
相关产品推荐

