能跑起来的最小cmake项目需三行cmakelists.txt加一个main.cpp:cmake_minimum_required(version 3.15)、project(hello languages cxx)、add_executable(hello main.cpp),源码与build目录必须分离,且cmakelists.txt须在源码根目录。

能跑起来的最小 CMake 项目,只需要三行 CMakeLists.txt + 一个 main.cpp,但很多人卡在第一步不是因为写错代码,而是目录结构或构建命令用错了。
怎么组织文件结构才不会报错
最简项目必须满足两个硬性条件:源码和构建目录要分离;CMakeLists.txt 必须在源码根目录。常见错误是把 build 文件夹建在项目外,或者把 main.cpp 放进子目录却没在 add_executable 中写对路径。
- 正确结构(推荐):
hello/ ├── CMakeLists.txt └── src/ └── main.cpp或者更简洁的平铺结构(新手首选):hello/ ├── CMakeLists.txt └── main.cpp
-
main.cpp内容只要能编译就行,比如:#include <iostream> int main() { std::cout </iostream> - 如果用了
src/目录,add_executable就得写成add_executable(hello src/main.cpp),不能漏掉src/前缀
cmake_minimum_required 和 project 怎么写才安全
这两行顺序不能颠倒,且 project 必须在 cmake_minimum_required 之后。版本号选太低(如 VERSION 2.8)会导致现代语法报错;选太高(如 VERSION 4.0)又可能让旧环境无法构建。
- 当前(2026 年)稳妥写法是:
cmake_minimum_required(VERSION 3.15)—— 覆盖绝大多数 CI 环境和发行版自带版本 -
project(hello LANGUAGES CXX)显式声明语言很重要:不加LANGUAGES CXX,CMake 可能默认只启用 C,导致std::cout报错 - 项目名(
hello)会成为生成的可执行文件默认名,也用于内部变量(如${PROJECT_NAME}),别用空格或特殊字符
构建命令为什么总失败
错误常出在「配置」和「构建」两个阶段混淆。CMake 不是编译器,它只生成构建系统;真正编译靠 make、ninja 或 VS 工具链。
- 正确流程分两步:
cmake -S . -B build(配置:从当前目录.读CMakeLists.txt,输出到build/)cmake --build build(构建:进build/执行实际编译) - 常见误操作:
cmake .(老写法,已弃用,易污染源码目录)cmake build(漏了-S和-B,CMake 会报找不到源码) - 第一次运行后,
build/里会出现Makefile或build.ninja,说明配置成功;如果只有空文件夹,就是-S或-B参数错了
add_executable 有哪些坑要避开
这行看着简单,但参数顺序、路径拼写、目标名重复都会直接导致构建中断。
- 格式固定为:
add_executable(<target_name><source_files...>)</source_files...></target_name>,第一个参数是目标名(非文件名),后面是源文件列表 - 目标名不能和已有变量同名(比如叫
project或cmake),否则 CMake 解析会崩溃 - 多个源文件用空格分隔,不要逗号:
add_executable(app main.cpp util.cpp)✅,add_executable(app main.cpp, util.cpp)❌ - 如果源文件在子目录,路径必须相对于
CMakeLists.txt所在位置,比如src/main.cpp,不能写成./src/main.cpp或绝对路径
最容易被忽略的是:CMake 不会自动重载修改后的 CMakeLists.txt。改完配置文件后,必须重新运行 cmake -S . -B build,否则后续 cmake --build build 仍用旧规则——这个细节导致大量“改了却不生效”的困惑。











