如果在CMake 3.11之前,所有的download都是在build time,包括ExternalProject_Add(这个暂时还没做实验)。如果是在build time进行,那么很多add_subdirectory会在configure time无法通过。如果你想在configure time进行download,可以通过 https://github.com/Crascit/DownloadProject 这个模块进行下载 3.11之后你可以用FetchContent,他最终在3.11进行了引入。他拥有如下几个特性: 比如我们直接看下面进行Catch2下载的例子: 这里我们进行了FetchContent_Declare的声明,在CMake 3.14之后我们可以直接通过FetchContent_MakeAvailable(catch)来一步到位,否则我们就需要 当然你可以自己写一个helper macro 通过这种方式,你就可以在你的CMakeLists.txt里使用Catch2了