结论:新手首次用CMake必须严格按顺序写三行——cmake_minimum_required(VERSION 3.10)、project(hello LANGUAGES CXX)、add_executable(hello main.cpp),前两行强制前置,否则报错;源文件路径须相对CMakeLists.txt且用正斜杠;构建必须在独立build目录中执行cmake ..。

直接说结论:新手第一次用 CMake,只写三行 CMakeLists.txt 就能跑通,但必须严格按顺序、大小写和路径来,否则 cmake .. 会报错或生成空构建系统。
cmake_minimum_required 和 project 必须放在最前面
这两行不是可选的“声明”,而是强制前置指令。CMake 解析时一旦遇到其他命令(比如 add_executable)而没看到 project(),就直接中断并报错:Parse error in command line argument: project 或更模糊的 Unknown CMake command "add_executable"。
-
cmake_minimum_required(VERSION 3.10)—— 建议写 3.10 而不是更低版本,避免旧语法陷阱(如不支持LANGUAGES CXX) -
project(hello LANGUAGES CXX)—— 显式声明语言,防止在纯 C 项目里误用 C++ 特性;hello是项目名,不是可执行文件名 - 这两行之后才能写
add_executable、set等任何其他指令
add_executable 的参数顺序不能颠倒
add_executable 第一个参数是生成的可执行文件名,第二个及之后是源文件路径 —— 这个顺序反了就会静默失败:生成的 Makefile 里没有目标,make 报 Nothing to be done for 'all'.。
- 正确:
add_executable(hello main.cpp) - 错误:
add_executable(main.cpp hello)(CMake 不报错,但构建系统不认) - 源文件路径是相对
CMakeLists.txt所在目录的,不能写成./src/main.cpp除非真有./src/子目录 - 多个源文件直接列出来:
add_executable(hello main.cpp util.cpp logger.cpp)
构建目录必须独立,不能在源码目录里执行 cmake .
新手常犯的错:在项目根目录(含 CMakeLists.txt 的地方)直接运行 cmake .。这叫“in-source build”,会导致源码目录被污染(生成大量 CMakeFiles/、CMakeCache.txt 等),且后续切换编译配置(Debug/Release)时冲突。
- 正确做法:建单独构建目录,比如
mkdir build && cd build && cmake .. -
..是关键 —— 它告诉 CMake 去上层目录找CMakeLists.txt - 如果用 Ninja,加
-G Ninja:cmake -G Ninja ..,否则默认用 Make - Windows 上用 Visual Studio 生成器,必须指定工具链:
cmake -G "Visual Studio 17 2022" -A x64 ..
常见报错和对应检查点
实际操作中卡住,90% 是这几个点漏了:
-
CMake Error: The source directory ".../project" does not appear to contain CMakeLists.txt.→ 检查当前工作目录是否在build目录,且..路径下真有CMakeLists.txt -
CMake Error at CMakeLists.txt:5 (add_executable): No SOURCES given to target: hello→add_executable后面没跟任何源文件,或文件名拼错了(比如写了main.cc但实际是main.cpp) -
fatal error: stdio.h: No such file or directory(Linux/macOS)→ 编译器没找到标准头文件,通常是没装build-essential(Ubuntu)或xcode-select --install(macOS) - Windows 上
cl.exe not found→ Visual Studio 的 “Desktop development with C++” 工作负载没装全,或者没在 Developer Command Prompt 里运行
真正麻烦的不是语法,而是路径、目录结构和环境隐含依赖 —— 这些不显式写在 CMakeLists.txt 里,但决定它能不能跑起来。


















