一、launch和tash到底在干啥
还没配好环境的同学参考vscode配置C++自己下载下g++。先重新把两个json摆在这
//task.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args": [
"-finput-charset=UTF-8",
"-fexec-charset=UTF-8",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$gcc"
}
]
}
//launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\bin\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "D:\\Programming\\MinGW-w64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
首先我要告诉大家的是编译和调试是两个步骤,实际上点左上角的按钮只会进行调试的,之所以大家可以在电脑上一键编译调试程序是因为我在launch.json
中加了这样一句:
"preLaunchTask": "build"
这一句的作用是啥呢,就是在执行launch之前提前执行执行一个叫build的任务(就是我写的task.json里面的那个),这个任务执行完之后就会生成可执行文件(就是xx.exe),随后vscode就会对生成的这个文件进行调试(但是这个也是我配置的)launch.json里面有这样一个program的变量指明了要调试的对象
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
这一行指明了要调试的是哪个文件,其中的${workspaceFolder}
就是一个环境变量,代表的意识就是你vscode打开的那个文件夹,它后面那个就是当前打开的文件不带后缀剩下的字符串,环境变量这里不展开,不是很常用,如果不是为了通用性了解这几个就够了,launch里面其他的变量含义可以看这个其他变量,这个json文件的意思就比较明了了,用miDebuggerPath里面提到的gdb程序(如果你电脑上的环境变量配好了可以不用指定具体路径,严重就是直接在命令行敲gdb -v,有对应的版本信息出来就ok)
所以如果有现成的exe文件,其实是可以直接修改launch在vscode里面直接调试,那么重点就是如何生成这个exe文件
二、如何不用task生成exe文件
不用task.json 也是可以直接生成exe文件的,但是需要在命令行(就是win+R再敲cmd中叫出来的那个,对应vscode里面的终端)中用g++程序自己去编译,假如我有一个这样的文件夹,里面是我写的一些程序,如何编译呢,直接在终端用相对路径去敲就好
g++ -g .\list\class.cpp .\main.cpp -I .\list\class.h -o example.exe
这样我们就自己通过g++生成了一个示范程序
接下来直接在launch中指定这个程序为调试程序就好(记得删除prelaunch那一行),那么我们看看这一个指令到底在干啥,其实很好理解,参考这个g++参数概览,指定了两个cpp文件作为编译对象(main.cpp ,list/class.cpp,可以用tab键自动补全),指定了一个.h头文件(实际上-I只是需要一个头文件所在的目录就可以了),指定了一个输出文件,这样就很简单就完成了一次编译活动。
这里可以自学一下正则表达式,或者直接记住*.cpp
这种表示的就是所有的以.cpp
为后缀的文件
三、如何修改task.json以使自己不用天天改
让我们回过头来看看task,其实只需要简单修改一下args里面的参数就可以继续一键调试了,比如我刚才的文件,对应这样的task.json即可,(注意如果是反斜杠需要些\,这两种方式都可以)
//其他的忽略
"args": [
"-g",
"${file}",
"${fileDirname}/list/*",
"-I","${fileDirname}/list",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
比较特殊的是有些同学的电脑上-g那一块的参数必须要把文件的后缀指定为.cpp,这个稍微注意下就好,实在不行就把绝对路径打上去即可,相对和绝对路径的知识看这里