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)
小结
本章我们学习了:
- FetchContent 基础:声明和获取
- 下载方式:Git、URL、本地路径
- 多依赖管理:批量获取
- 覆盖配置:控制依赖行为
练习
- 使用 FetchContent 下载并链接 fmt 库
- 下载 Google Test 并设置测试
- 管理多个外部依赖