CMakeLists.txt只需描述模块及依赖关系,现代CMake(3.20+)要求所有配置挂载到target:cmake -S . -B build配置,cmake --build build构建;头文件路径须用target_include_directories指定作用域,改配置后必须重新configure。

直接上手写 CMakeLists.txt,别背命令,也别先看“CMake 是啥”这种抽象解释——你只需要知道它干两件事:描述「有哪些模块」和「模块之间怎么连」,其余交给 cmake 和 make(或 ninja)去算。
从一个能跑通的 CMakeLists.txt 开始
别用网上那些带 include_directories、link_directories 的老教程。现代 CMake(3.10+)只认 target,所有配置都得挂到 target 上。
-
cmake_minimum_required(VERSION 3.20)—— 版本别低于 3.10,但建议直接写 3.20,避免踩旧语法坑 -
project(hello LANGUAGES CXX)—— 明确声明语言,CMake 才会自动启用对应标准(比如 C++17) -
add_executable(hello main.cpp)—— 这是唯一必须的构建指令,hello是 target 名,也是最终生成的可执行文件名 - 如果要用 C++17 或更高标准,加一句:
set_property(TARGET hello PROPERTY CXX_STANDARD 17),而不是全局设CMAKE_CXX_STANDARD
cmake -S . -B build 和 cmake --build build 必须分清
这是最容易混淆的两个阶段,混用会导致缓存错乱、配置不生效、甚至编译失败。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
cmake -S . -B build是「配置」:读CMakeLists.txt,检查编译器、找依赖、生成build/下的构建脚本(如Makefile或build.ninja),不编译代码 -
cmake --build build是「构建」:调用底层工具(make或ninja)真正编译链接,输出二进制 - 改了
CMakeLists.txt后,必须重新运行cmake -S . -B build(或进build/目录执行cmake ..),否则新配置不会生效 - 删
build/目录是最干净的重置方式;make clean只清产物,不清 CMake 缓存
为什么 add_executable 后要立刻配 target_include_directories?
因为头文件路径不是全局的,现代 CMake 要求每个 target 显式声明自己需要哪些头文件路径——这是解耦和可复现的关键。
- 错误写法:
include_directories(${PROJECT_SOURCE_DIR}/include)—— 全局污染,下游 target 会被意外影响 - 正确写法:
target_include_directories(hello PUBLIC ${PROJECT_SOURCE_DIR}/include)——PUBLIC表示:这个路径既供hello自己用,也透传给依赖它的其他 target - 如果只是内部实现用(比如
.cpp里包含私有头),用PRIVATE;如果只供别人用(比如你写的是库,头文件要被用户 include),用INTERFACE -
${PROJECT_SOURCE_DIR}是绝对路径,别手写相对路径,否则跨目录构建会崩
真正卡住人的从来不是语法,而是「target 没声明依赖」「头文件路径没挂到 target 上」「改了 CMakeLists.txt 没重新 configure」这三类问题。盯住这三个点,比记一百个命令有用得多。

















