add_executable()是CMake中唯一用于生成可执行文件的命令,必须显式声明目标;其三个核心要素为:唯一全局的target_name、实际存在的源文件路径列表、正确的参数顺序(target_name在前、源文件在后),缺一不可。

add_executable() 是唯一能生成可执行文件的 CMake 命令,不是靠写个 main.cpp 就自动编译——必须显式声明目标。
必须写对 add_executable() 的三个要素
它不是“运行一下就出来”的黑盒命令,参数错一个就根本不会生成可执行文件:
-
target_name:逻辑目标名,必须全局唯一(比如不能和另一个add_executable()或add_library()重名);它默认就是最终二进制名(Linux 下无后缀,Windows 下自动加.exe) - 源文件列表:必须是实际存在的
.cpp、.c等文件路径,相对路径以当前CMakeLists.txt所在目录为基准;不能只写main或main.o——CMake 不会自动补扩展名或找文件 - 顺序不能反:
add_executable(hello main.cpp)正确;add_executable(main.cpp hello)会报错Parse error in command add_executable
cmake .. 之前必须进 build/ 目录
直接在源码根目录下运行 cmake . 虽然能跑通,但会污染源码树(生成大量 CMakeCache.txt、CMakeFiles/),后续清理麻烦,且某些 IDE(如 VS Code 的 CMake Tools)默认要求 out-of-source 构建。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确流程:
mkdir build && cd build && cmake .. -
..表示上一级目录的CMakeLists.txt,CMake 会从那里读配置 - 如果漏掉
cd build,cmake ..可能静默失败(尤其 Windows 上用 Ninja 时),或者生成的可执行文件路径混乱(比如跑到源码目录里)
常见错误:明明写了 add_executable() 却没生成文件
不是编译失败,而是压根没触发构建——最常踩的坑是:
- 忘记写
cmake_minimum_required(VERSION X.Y)在第一行:CMake 版本太低时直接退出,不报具体错误,只显示CMake Error at CMakeLists.txt:1:(连行号都模糊) -
project()缺失或写在add_executable()后面:CMake 允许,但部分旧版本( - 源文件路径写错:比如写成
src/main.cpp,但实际文件在./main.cpp;CMake 不报“找不到文件”错误,而是静默跳过该源,最后链接时报undefined reference to 'main' - 构建后没去
build/目录找:可执行文件默认输出在build/下对应层级(如build/hello),不是源码目录里的hello
想改输出位置或名字?别碰 OUTPUT_NAME 以外的属性
新手常试图用 set(CMAKE_BINARY_DIR ...) 或 set(EXECUTABLE_OUTPUT_PATH ...) 控制路径,但这些变量早已被弃用(CMake 3.0+ 不生效),强行设置反而干扰默认行为。
- 改输出目录:用
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)(仅影响可执行文件) - 改最终文件名(不改逻辑名):在
add_executable()后加set_target_properties(hello PROPERTIES OUTPUT_NAME myapp) - 别用
file(COPY ...)或configure_file()替代构建逻辑——它们不参与依赖检查,改了源码也不会自动重编
build/CMakeCache.txt 里有没有 hello_EXECUTABLE 这样的条目——没有,说明 add_executable() 根本没被解析进去,问题出在语法或前置条件上。

















