vscode中c/c++编译的临时文件默认散落源码目录,需通过修改code-runner.executormap和launch.json统一输出到build目录,并手动创建build目录、清理旧文件、注意变量差异与路径后缀。

VSCode 运行代码产生的临时文件(如 C/C++ 编译出的 .exe 或 a.out)默认就堆在源码目录里,不设法隔离,很快就会污染项目结构。这不是 bug,是默认行为;但完全可改,且必须改——尤其当你用 Code Runner 或 launch.json 调试时。
Code Runner 的输出路径由 executorMap 决定
它不读 tasks.json 或编译器配置,只认自己那一套变量替换规则。想让 g++ 生成的二进制进指定文件夹,就得重写 cpp 对应的命令行:
- 打开工作区根目录下的
.vscode/settings.json(没有就新建) - 在
"code-runner.executorMap"中覆盖"cpp"条目,例如:
{
"code-runner.executorMap": {
"cpp": "cd $dir && g++ $fileName -o $workspaceRoot/build/$fileNameWithoutExt && $workspaceRoot/build/$fileNameWithoutExt"
}
}
注意:$workspaceRoot/build/ 必须提前存在,否则 g++ 会报 no such file or directory 错误;$fileNameWithoutExt 是关键,它去掉 .cpp 后缀,避免生成 main.cpp.exe 这种怪名。
调试时的 .exe 位置由 launch.json 的 program 控制
这是 C/C++ 扩展调试器的行为,和 Code Runner 无关。哪怕你改了 executorMap,断点调试仍会按 launch.json 里写的路径去找可执行文件:
- 确保
.vscode/launch.json中"program"字段指向你期望的位置,比如:
"program": "${fileDirname}/build/${fileBasenameNoExtension}"
Windows 下要加 .exe 后缀:"${fileDirname}/build/${fileBasenameNoExtension}.exe";${fileDirname} 是当前文件所在目录,不是工作区根目录,这点容易混淆。
同时检查 "cwd"(当前工作目录)是否匹配——如果程序依赖相对路径读取资源,cwd 设错会导致运行时找不到文件。
别漏掉 build 目录的权限和清理问题
把输出统一扔进 build/ 看似干净,但实际有三个坑:
- VSCode 不自动创建
build/目录,g++也不会帮你 mkdir,得手动建好或在命令里加mkdir -p(Linux/macOS)或if not exist build md build(Windows cmd) -
build/里积累的旧二进制不会自动清理,多次编译后可能运行错版本;建议在executorMap命令末尾加&& rm $workspaceRoot/build/*.o(或对应中间文件) - 如果用了多级子目录(如
$workspaceRoot/build/$dirName/),要注意$dirName并非内置变量——得用$dir拆解,或直接写死路径
真正麻烦的不是怎么写路径,而是不同插件(Code Runner、C/C++、tasks.json)各自维护一套变量和逻辑,稍不注意就出现「运行一个版本,调试另一个版本」的情况。动手前先确认你用的是哪个执行机制,再锁死对应配置文件。











