跳到主要内容

CMake FetchContent

FetchContent 模块允许在配置时从外部源下载内容,是现代 CMake 管理依赖的推荐方式。

基本用法

声明和获取

include(FetchContent)

FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
)

FetchContent_MakeAvailable(googletest)

# 使用
enable_testing()
target_link_libraries(myapp PRIVATE GTest::gtest_main)

完整示例

cmake_minimum_required(VERSION 3.15)
project(MyProject)

include(FetchContent)

# 声明依赖
FetchContent_Declare(
fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG 10.0.0
)

# 获取并使其可用
FetchContent_MakeAvailable(fmt)

# 创建目标并链接
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE fmt::fmt)

下载方式

Git 仓库

FetchContent_Declare(
mylib
GIT_REPOSITORY https://github.com/user/mylib.git
GIT_TAG v1.0.0 # 标签
GIT_TAG main # 分支
GIT_TAG abc123 # 提交哈希
)

URL 下载

FetchContent_Declare(
mylib
URL https://example.com/mylib-1.0.tar.gz
URL_HASH SHA256=abc123...
)

本地路径

FetchContent_Declare(
mylib
SOURCE_DIR /path/to/local/mylib
)

多依赖管理

include(FetchContent)

# 声明多个依赖
FetchContent_Declare(
fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
GIT_TAG 10.0.0
)

FetchContent_Declare(
spdlog
GIT_REPOSITORY https://github.com/gabime/spdlog.git
GIT_TAG v1.12.0
)

# 一次性获取
FetchContent_MakeAvailable(fmt spdlog)

target_link_libraries(myapp PRIVATE fmt::fmt spdlog::spdlog)

覆盖配置

# 在用户项目中覆盖依赖选项
set(FMT_INSTALL OFF CACHE BOOL "" FORCE)

FetchContent_MakeAvailable(fmt)

小结

本章我们学习了:

  1. FetchContent 基础:声明和获取
  2. 下载方式:Git、URL、本地路径
  3. 多依赖管理:批量获取
  4. 覆盖配置:控制依赖行为

练习

  1. 使用 FetchContent 下载并链接 fmt 库
  2. 下载 Google Test 并设置测试
  3. 管理多个外部依赖