g++默认生成a.out,需用-o指定输出名,如g++ main.cpp -o myapp;Makefile中由首个target决定,CMake中由add_executable()首参决定,Windows自动加.exe后缀。

g++ 编译时用 -o 指定输出文件名
默认情况下,g++ 把可执行文件命名为 a.out,这显然不适合实际项目。最直接的方式是在编译命令末尾加 -o 参数,后接你想要的名字:
g++ main.cpp -o myapp
执行后当前目录下就生成了名为 myapp 的可执行文件。注意:-o 后面**不能有空格隔开文件名**(常见错误),比如 -o myapp 是对的,而 -o myapp(多空格)或 -o=myapp(等号写法)在某些旧版本 g++ 中可能报错或被忽略。
Makefile 里通过 target 控制输出名
如果你用 make 管理构建,最终可执行文件名由 Makefile 中的**第一个目标(或显式指定的 target)决定**,而不是硬编码在命令里。例如:
myapp: main.o utils.o g++ $^ -o $@
这里 $@ 自动展开为目标名 myapp,所以生成的就是 myapp。如果把第一行改成 cooltool: main.o utils.o,输出就是 cooltool。别漏掉 -o $@ —— 否则仍会输出 a.out。
立即学习“C++免费学习笔记(深入)”;
CMake 中设置 add_executable() 的第一个参数
CMake 不靠命令行参数,而是靠 add_executable() 的第一个参数定义最终程序名:
add_executable(myapp main.cpp utils.cpp)
这个 myapp 就是生成的可执行文件名(不含扩展名)。Windows 下自动加 .exe,Linux/macOS 下就是纯 myapp。注意:这个名称**不能包含路径或斜杠**,否则 CMake 会报错;如果想控制输出目录,得用 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ...) 单独配置。
链接阶段重命名(不推荐但可行)
编译完生成了 a.out 或其他名字,也可以后续用 mv 改名:
g++ main.cpp && mv a.out myapp
但这只适合临时调试,破坏了构建的可重现性。更隐蔽的问题是:如果项目含多个可执行目标、或依赖 install 规则,手动改名会导致 make install 安装错误的文件,或者 CMake 的 find_package() 找不到预期的二进制名。
真正容易被忽略的是:IDE(如 VS Code + C/C++ 扩展)或构建系统(如 Ninja)有时会缓存旧的输出名,改了 -o 或 add_executable() 后没 clean 就重编,可能还在跑老文件。遇到“明明改了名字却还是生成 a.out”,先 make clean 或删掉 build/ 目录再试。


















