在使用VS Code进行开发过程中,发现存在这样一个问题:如果先写了个能够成功编译并运行的程序,在对其运行->启动调试
后,则会编译生成一个可以运行的程序文件,再进入调试模式;如果此时再修改代码,导致新的代码无法编译通过,但是由于原有编译生成的文件未被删除,仍然能够进入调试,所以希望能够在每次调试前都删除之前编译得到的程序文件。
在如何在VS Code进行C++开发时编译多个文件中,曾经提到在VS Code中tasks.json
和launch.json
分别用于控制编译与运行,因此可以修改tasks.json
使得在进行编译之前,先行删除之前编译所生成的文件。
基于修改tasks.json
的思路,首先观察原有的文件内容:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++", // 执行g++命令,使用g++进行编译
"args": [ // g++的各种参数
"-fdiagnostics-color=always", // 不重要的参数
"-ggdb", // 不重要的参数
"${file}", // 不重要的参数
"src/iostream_extension.cpp", // 不重要的参数
"-o", // 指定编译生成的程序文件路径和文件名
"${fileDirname}/bin/${fileBasenameNoExtension}" // 编译生成文件目录:代码所在目录下的bin文件夹
// 编译生成文件名:代码文件名(无扩展名)
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。",
"dependsOn": [
"C/C++: g++ 编译前清理",
]
}
],
"version": "2.0.0"
}
如上所示:tasks中仅包括一个任务,该任务类型(type)为cppbuild,即C++编译,如果希望在该任务执行前删除之前编译生成的文件,那么我们可以添加一个被该任务依赖的新任务,新的任务负责删除之前编译生成的文件,另外我们需要建立原有任务对新任务的依赖,修改后的tasks.json
文件如下:
{
"tasks": [ // 在tasks下新建一个新的task
{
"type": "shell", // 新任务采用shell运行
"label": "C/C++: g++ 编译前清理", // 新任务名称为:C/C++: g++ 编译前清理
"command": "rm", // 执行rm命令,删除文件或目录
"args": [
"-rf", // 递归删除,忽略文件不存在的情况
"${fileDirname}/bin/${fileBasenameNoExtension}" // 待删除文件路径
],
},
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++", // 执行g++命令,使用g++进行编译
"args": [ // g++的各种参数
"-fdiagnostics-color=always", // 不重要的参数
"-ggdb", // 不重要的参数
"${file}", // 不重要的参数
"src/iostream_extension.cpp", // 不重要的参数
"-o", // 指定编译生成的程序文件路径和文件名为...
"${fileDirname}/bin/${fileBasenameNoExtension}" // 编译生成文件目录:代码所在目录下的bin文件夹
// 编译生成文件名:代码文件名(无扩展名)
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。",
"dependsOn": [ // 建立依赖,依赖于任务"C/C++: g++ 编译前清理"
"C/C++: g++ 编译前清理",
]
}
],
"version": "2.0.0"
}
如上所示,我们建立了新的任务,并且添加了依赖,这样就可以在每次编译之前删除之前所生成的文件了。
任务依赖的建立主要参考:VS Code中执行多个task