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 通过 find_package 支持系统级依赖查找,FetchContent 可以在配置时下载源码依赖,Conan 和 vcpkg 则提供了更完整的包管理方案。

一个好的构建系统应该让正确的事变得容易,错误的事变得困难。