CMake FetchContent_Declare 的用法
FetchContent_Declare 是 CMake 3.11+ 引入的模块,用于在配置阶段下载和管理外部依赖项。它是 ExternalProject的轻量级替代方案,更简单易用。
1. 基本用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| cmake_minimum_required(VERSION 3.14) project(MyProject)
include(FetchContent)
FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.11.0 )
FetchContent_MakeAvailable(googletest)
add_executable(my_test test.cpp) target_link_libraries(my_test gtest_main)
|
2. 主要参数详解
2.1. Git 仓库
1 2 3 4 5 6 7 8 9 10 11
| FetchContent_Declare( mylib GIT_REPOSITORY https://github.com/user/repo.git GIT_TAG v1.0.0 GIT_TAG main GIT_TAG abc1234 GIT_SHALLOW TRUE GIT_PROGRESS TRUE )
|
2.2. 压缩包下载
1 2 3 4 5 6 7 8 9
| FetchContent_Declare( mylib URL https://example.com/library-1.0.0.tar.gz URL_HASH SHA256=abc123... URLS https://mirror1.com/lib.tar.gz https://mirror2.com/lib.tar.gz )
|
2.3. SVN 仓库
1 2 3 4 5
| FetchContent_Declare( mylib SVN_REPOSITORY https://svn.example.com/repo SVN_REVISION -r12345 )
|
3. 高级用法
3.1. 覆盖选项
1 2 3 4 5 6 7 8 9 10 11
| FetchContent_Declare( mylib GIT_REPOSITORY https://github.com/user/mylib.git GIT_TAG main CMAKE_ARGS -DBUILD_SHARED_LIBS=OFF -DCMAKE_CXX_STANDARD=17 OVERRIDE_FIND_PACKAGE )
|
3.2. 手动控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 8.1.1 )
FetchContent_GetProperties(fmt) if(NOT fmt_POPULATED) FetchContent_Populate(fmt) add_subdirectory(${fmt_SOURCE_DIR} ${fmt_BINARY_DIR}) endif()
|
3.3. 多个依赖
1 2 3 4 5 6 7
| FetchContent_Declare(lib1 ...) FetchContent_Declare(lib2 ...) FetchContent_Declare(lib3 ...)
FetchContent_MakeAvailable(lib1 lib2 lib3)
|
4. 完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| cmake_minimum_required(VERSION 3.14) project(MyApp)
include(FetchContent)
FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.13.0 CMAKE_ARGS -DCMAKE_CXX_STANDARD=17 -DBUILD_GMOCK=ON )
FetchContent_Declare( nlohmann_json URL https://github.com/nlohmann/json/releases/download/v3.11.2/json.tar.xz URL_HASH SHA256=6bea5870bae7c4b53e6e9d7b8d58c5c4d7c5b9a1c5a5a5a5a5a5a5a5a5a5a5a )
FetchContent_Declare( spdlog GIT_REPOSITORY https://github.com/gabime/spdlog.git GIT_TAG v1.11.0 GIT_SHALLOW TRUE )
FetchContent_MakeAvailable(googletest nlohmann_json spdlog)
add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE nlohmann_json::nlohmann_json spdlog::spdlog )
enable_testing() add_test(NAME my_test COMMAND my_app_test)
|
5. 注意事项
- 缓存目录: 默认下载到
${CMAKE_BINARY_DIR}/_deps
- 网络问题: 配置时需要网络连接
- 版本控制: 推荐使用特定版本标签,避免意外更新
- 离线模式: 可以使用
-DFETCHCONTENT_FULLY_DISCONNECTED=ON 禁用下载
6. 与 find_package 比较
1 2 3 4 5 6 7 8 9 10 11
| find_package(Boost 1.70 QUIET)
if(NOT Boost_FOUND) FetchContent_Declare( Boost URL https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.tar.bz2 ) FetchContent_MakeAvailable(Boost) endif()
|
使用 FetchContent_Declare 可以方便地管理项目依赖,特别适合小型到中型项目。