CMake是跨平台构建系统生成器,通过CMakeLists.txt自动生成各平台原生构建文件;必须以cmake_minimum_required(VERSION 3.10)和project()开头且顺序不可颠倒,add_executable中路径相对CMAKE_CURRENT_SOURCE_DIR,需外部构建并显式设置C++标准。

不用从“什么是CMake”开始讲——你只要知道:它不是编译器,也不是IDE,而是一个帮你自动生成编译指令的脚本工具;你写一次 CMakeLists.txt,就能在 Windows、Linux、macOS 上用各自的原生工具(VS、Make、Ninja)把代码编译出来。
cmake_minimum_required 和 project 必须写对,否则直接报错
这两个命令是每个 CMakeLists.txt 的开头固定组合,顺序不能颠倒,缺一不可。版本号写低了会提示 CMake 3.x or higher is required;写高了(比如本地只有 3.10 却写了 VERSION 3.25)则根本无法解析。
-
cmake_minimum_required(VERSION 3.10)是底线,3.10 覆盖绝大多数现代语法,低于 3.8 的旧版不建议用 -
project(MyApp LANGUAGES CXX)中的LANGUAGES推荐显式指定,不写默认包含 C 和 CXX,但如果你只用 C++,明确写上能避免 C 编译器被意外调用 - 项目名里不要含空格或特殊字符,否则某些生成器(如 VS)会出问题;
My-App可以,My App不行
add_executable 为什么找不到源文件?路径和构建方式是关键
常见错误是执行 cmake .. 后报 Cannot find source file: main.cpp,其实不是文件不存在,而是 CMake 没在它认为的“当前源码目录”里找。
-
add_executable(hello main.cpp)中的main.cpp是相对于CMAKE_CURRENT_SOURCE_DIR(即该CMakeLists.txt所在目录)的路径,不是你当前终端所在位置 - 务必使用外部构建(out-of-source build):先
mkdir build && cd build,再cmake ..;如果直接在源码目录运行cmake .,生成的中间文件会污染源码树,且某些 IDE(如 CLion)会拒绝识别 - 源文件名大小写敏感:Linux/macOS 下
Main.cpp≠main.cpp,Windows 虽不敏感但统一小写更安全
编译失败时,先看 cmake 命令是否真成功了
很多人卡在 make 或 cmake --build . 报错,但没意识到前面的 cmake .. 其实已经失败——只是终端滚动太快没注意最后一行的 -- Configuring incomplete, errors occurred!。
- 每次执行
cmake ..后,第一件事是扫一眼最后几行输出:有-- Build files have been written to:才算配置成功 - 如果报
Could not find compiler set in environment variable CC,说明没装编译器或没加进 PATH(Windows 装 VS 要勾选“C++ 构建工具”,Linux 要装build-essential) - 改了
CMakeLists.txt后,不需要删整个build目录,但必须重新运行cmake ..—— CMake 不会自动检测配置变更并重载
最容易被忽略的一点:CMake 不会自动推断 C++ 标准。即使你用了 std::optional 或 std::span,也得手动加 set(CMAKE_CXX_STANDARD 17) 或更高,否则默认可能是 C++98/03,编译器报错时根本不会提示“标准太低”,只会说“identifier not found”。


















