最简CMakeLists.txt需三行:cmake_minimum_required(VERSION 3.10)、project(hello)、add_executable(hello main.cpp),且必须在独立build目录中执行cmake ..,main.cpp须真实存在并大小写精确匹配。

最简 CMakeLists.txt 长什么样
能通过 cmake 生成构建文件、再用 make(或 ninja)编译成功的最小 CMakeLists.txt,只需要三行:
cmake_minimum_required(VERSION 3.10) project(hello) add_executable(hello main.cpp)
这三行分别干了三件事:声明最低 CMake 版本、定义项目名、把 main.cpp 编译成可执行文件 hello。注意:project() 必须在 add_executable() 之前;main.cpp 必须真实存在且位于当前目录。
为什么 cmake_minimum_required 不能写太低
低于 3.10 会触发警告甚至失败,尤其在较新系统(如 Ubuntu 22.04+、macOS Homebrew 默认 CMake 3.25+)上。旧版本(如 2.8)不支持 target_compile_features、现代作用域规则,也容易在 Windows MSVC 或 Apple Clang 下出兼容问题。
-
3.10是目前广泛兼容的底线,支持find_package(... REQUIRED)的显式报错语义 - 若用 C++17 特性(比如
std::optional),建议升到3.15并加set(CMAKE_CXX_STANDARD 17) - 写成
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)没必要——它本来就是硬性要求
add_executable 的常见陷阱
新手常在这里卡住,不是语法错,而是路径和依赖没理清:
立即学习“C++免费学习笔记(深入)”;
- 文件名必须精确匹配,
main.CPP或Main.cpp在 Linux/macOS 下不会被自动识别 - 多个源文件要全部列出来:
add_executable(app main.cpp util.cpp logger.cpp),漏一个就链接失败 - 如果源文件在子目录(如
src/main.cpp),路径必须写全:add_executable(app src/main.cpp) - 不要在
add_executable()后面直接写include_directories(./include)——改用target_include_directories(app PRIVATE include),否则全局污染且不可继承
编译前必须做的两件事
写完 CMakeLists.txt 不代表能直接 make。CMake 是生成器,不是构建器:
- 必须新建独立的构建目录(推荐
build/),然后在里面运行cmake ..—— 直接在源码目录运行cmake .会污染源树,且后续清理麻烦 - 确认当前 shell 已安装编译器:运行
g++ --version或clang++ --version;若提示 command not found,CMake 会静默降级为“no compiler”,最终报错Cannot determine linker language for target
复杂点往往不在语法,而在 CMake 的 out-of-source 构建习惯和编译器环境是否真正就绪。


















