解决问题:VSCode环境下多文件夹的编译与调试
说明:编译器选择的是mingGW64
解决思路:针对task.json和launch.json两个文件
- 编译:与task.json文件相关
- 调试:与launch.json文件相关
修改后的task.json文件如下,只需修改两处:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "D:\\build tool\\mingw64\\bin\\gcc.exe", //检查确认编译器路径
"args": [
"-fdiagnostics-color=always",
"-g",
// "${file}", //修改1:屏蔽此处,改为如下
"${fileDirname}\\*.c", //修改1:当前文件夹所有的.c文件都编译
"${fileDirname}\\app\\*.c", //多文件夹需将文件夹下的所有.c文件都包含进来
"${fileDirname}\\bsp\\*.c",
"-o",
// "${fileDirname}\\${fileBasenameNoExtension}.exe" //修改2:将输出文件改为如下指定名称
"${fileDirname}\\output.exe"
],
"options": {
"cwd": "${fileDirname}" //注释说明:任务开始运行时的当前工作目录
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
修改后的launch.json文件如下,也是只需修改两处:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
// "program": "输入程序名称,例如 ${workspaceFolder}/a.exe", //修改1:将需要调试的可执行程序改为与task.json中【修改2】处的路径与名称一致,如下所示:
"program": "${fileDirname}\\output.exe", //需要调试的可执行程序
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
// "miDebuggerPath": "/path/to/gdb", //修改2:修改gdb路径
"miDebuggerPath": "D:\\build tool\\mingw64\\bin\\gdb.exe", //自己电脑中gdb的位置
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
补充:json文件中,常用的变量名所代表的含义:
变量名 | 含义 |
---|---|
${workspaceRoot} | 当前打开的文件夹的绝对路径+文件夹的名字 |
${workspaceRootFolderName} | 当前打开的文件夹的名字 |
${file} | 当前打开正在编辑的文件名,包括绝对路径,文件名,文件后缀名 |
${relativeFile} | 从当前打开的文件夹到当前打开的文件的路径,如当前打开的是test文件夹,当前的打开的是main.c,并有test/first/second/main.c 那么此变量代表的是 first / second / main.c |
${fileBasename} | 当前打开的文件名+后缀名,不包括路径 |
${fileBasenameNoExtension} | 当前打开的文件的文件名,不包括路径和后缀名 |
${fileDirname} | 当前打开的文件所在的绝对路径,不包括文件名 |
${fileExtname} | 当前打开的文件的后缀名 |
${cwd} | 任务开始运行时的当前工作目录 |
${lineNumber} | 前打开的文件,光标所在的行数 |