最简可用cmakelists.txt需三行:cmake_minimum_required(version 3.10)、project(hello languages cxx)、add_executable(hello main.cpp),且必须在独立build目录中执行cmake ..,源文件路径须严格匹配相对位置,避免in-source build和大小写错误。

CMakeLists.txt 不是“写完就能跑”的配置文件,它必须和项目结构、构建流程匹配。安装完 CMake 后,直接在源码根目录写一个 CMakeLists.txt,再进 build 目录执行 cmake ..,才是正确起点。
怎么写最简可用的 CMakeLists.txt
只要三行就能让 main.cpp 编译成可执行文件,前提是项目结构干净:
-
cmake_minimum_required(VERSION 3.10)—— 版本不能低于你本地安装的 CMake(用cmake --version确认) -
project(hello LANGUAGES CXX)——LANGUAGES CXX显式声明语言,避免某些旧版 CMake 对 C++ 源文件后缀(如.cpp)识别失败 -
add_executable(hello main.cpp)—— 文件名必须真实存在,路径是相对于CMakeLists.txt所在目录的相对路径;不能写成add_executable(hello ./main.cpp)或add_executable(hello ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp),CMake 会报错或静默忽略
为什么 build 目录不能和源码混在一起
执行 cmake .. 时,CMake 会把生成的中间文件(比如 CMakeCache.txt、Makefile、对象文件)全塞进当前目录。如果直接在源码目录运行,这些文件会污染 Git 工作区,还可能被误删或误提交。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确做法:在项目根目录下
mkdir build && cd build,再运行cmake .. - 错误做法:在源码目录直接运行
cmake .—— 这会触发 in-source build,CMake 官方明确不推荐 - 如果已经误操作,删掉所有生成文件比手动清理更安全:
rm -rf CMake*和rm -f Makefile,再重建build目录
常见错误:add_executable 找不到源文件
现象是 cmake .. 报错:Cannot find source file "main.cpp",即使文件明明就在当前目录。
- 检查大小写:
Main.cpp≠main.cpp(Linux/macOS 区分大小写) - 检查隐藏字符:用
cat -A CMakeLists.txt查看是否有不可见的 BOM 或制表符混入 - 检查路径层级:如果
main.cpp在src/子目录,add_executable(hello src/main.cpp)才对;写成add_executable(hello main.cpp)就会失败 - 不要用
set(SOURCES main.cpp)再引用 —— 初期没必要,反而容易漏写${SOURCES}的$和{}
C++ 标准和编译器警告要加在哪儿
不是加在全局,而是绑定到具体目标上,否则在多目标项目里会失效或冲突。
- 正确写法:
target_compile_features(hello PRIVATE cxx_std_17)或target_compile_options(hello PRIVATE -Wall -Wextra) - 错误写法:
add_compile_options(-Wall)—— 它影响所有后续add_executable和add_library,但无法按目标开关,且在子目录中行为不可控 - 如果只用 C++17,
set(CMAKE_CXX_STANDARD 17)可以设全局,但它只是“默认值”,不强制启用新特性;真正控制特性支持的是target_compile_features
CMakeLists.txt 当成脚本写,而忽略了它本质是一份**声明式构建契约**——你声明了什么,CMake 才生成什么,不多也不少。










