CMake本身不生成可执行文件,只生成构建系统(如Makefile);执行cmake .后无可执行文件,因需再运行make等构建工具触发实际编译链接。

直接说结论:CMake 本身不生成可执行文件,它只生成构建系统(比如 Makefile),真正编译链接靠 make 或其他构建工具。
为什么执行 cmake . 后没有可执行文件?
CMake 是一个“元构建系统”——它读取 CMakeLists.txt,检查编译器、路径、依赖,然后输出本地构建脚本(如 Linux 下的 Makefile)。你看到的只是中间产物,不是最终程序。
-
cmake .(在含CMakeLists.txt的目录执行)只生成Makefile和缓存文件(CMakeCache.txt等),不会调用编译器 - 必须再运行
make(或ninja等对应构建工具)才会触发实际编译、链接,生成可执行文件 - 如果
add_executable()指定的目标名是hello,那最终生成的文件就是当前目录下的hello(Linux/macOS)或hello.exe(Windows)
add_executable() 写错会导致什么?
这是最常卡住的地方:CMake 配置没报错,但 make 时找不到源文件,或生成空目标。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 源文件路径写错:比如
add_executable(hello src/main.cpp),但实际文件在main.cpp根目录——CMake 不会自动递归查找,路径必须精确匹配 - 文件名大小写敏感:Linux 下
Main.cpp≠main.cpp,写错就报no such file - 目标名重复:同一
CMakeLists.txt中两次add_executable(foo ...)会冲突,CMake 会直接退出并报错 - 忘记
project():虽然某些旧版本容忍,但现代 CMake(≥3.10)要求project()必须在add_executable()前,否则报command not found
推荐用构建目录隔离,别用 cmake .
直接在源码目录执行 cmake . 会把生成文件(Makefile、对象文件、缓存)混进源码里,git 提交容易误提交,且清理麻烦。
- 正确做法:创建独立构建目录,例如
mkdir build && cd build - 然后运行
cmake ..(注意是两个点,表示上层源码目录) - 再运行
make—— 可执行文件默认输出到build/目录下 - 若想控制输出位置,可在
CMakeLists.txt中加:set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
修改代码后怎么重新生成?
不用重跑 cmake,除非改了 CMakeLists.txt 或增删源文件。
- 只改了
.cpp或.h?直接在构建目录下make即可,它会自动检测改动并只重编相关目标 - 加了新源文件?需更新
add_executable()参数,然后重新运行cmake ..(或make rebuild_cache),再make - 删了源文件但没改
CMakeLists.txt?make会失败,提示找不到文件,必须先同步修改add_executable()
最容易被忽略的是:CMake 不会自动感知头文件依赖变更(除非你用 target_include_directories() 正确设置),改了头文件但没改源文件,make 可能跳过重编——这时候得手动 make clean && make 或删掉构建目录重来。

















