CMake 是 C++ 生态中最主流的构建系统。现代 CMake(3.12+)强调 target-based 设计,通过 PUBLIC、PRIVATE、INTERFACE 来精细控制头文件和链接依赖的传播范围。
Target-Based 设计
不要使用全局的 include_directories 和 link_libraries,而是为每个 target 声明其依赖:
add_library(core STATIC src/core.cpp)
target_include_directories(core
PUBLIC include # 消费者也需要
PRIVATE src # 仅自身需要
)
target_link_libraries(core
PRIVATE internal_lib # 不传播
PUBLIC fmt::fmt # 传播给消费者
)
现代 CMake 最佳实践
- 使用 cmake_minimum_required(VERSION 3.16) 或更高。
- 使用 FetchContent 或 find_package 管理依赖。
- 用 PRESET 管理不同的构建配置。
- 避免直接修改 CMAKE_CXX_FLAGS,用 target_compile_options/features。
包管理
CMake 通过 find_package 支持系统级依赖查找,FetchContent 可以在配置时下载源码依赖,Conan 和 vcpkg 则提供了更完整的包管理方案。
一个好的构建系统应该让正确的事变得容易,错误的事变得困难。