关于Vscode的C语言的单文件调试,可以参见VScode调试C语言的设置(win10,Linux),里面已经说明基本的配置和使用。
下面说明一下如何调试多个文件的工程,首先写一个简单的工程,其中工程目录如下图1所示。
图1 工程目录结构
文件的结构也特别简单,就是在每一个文件夹下放置两个文件,一个为xxx.c的文件,一个为xxx.h的文件,这么存放文件的好处就是:结构比较清楚,对于已经完成的demo文件,也更加方便移植。
首先,对于add.c,内容如下
#include "sub.h"
int sub(int a, int b)
{
return a + b;
}
对于add.h文件,内容如下
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif
对于其他的几个文件,都是按照这种形式编写,只不过完成的就是简单的加减乘除的功能。
关于main.c的内容
#include "stdio.h"
#include "./add/add.h"
#include "./sub/sub.h"
#include "./mul/mul.h"
#include "./dev/dev.h"
int main(int argc, const char **argv)
{
int a = 10, b = 2;
printf("a + b = %d\r\n", add(a, b));
printf("a - b = %d\r\n", sub(a, b));
printf("a * b = %d\r\n", mul(a, b));
printf("a / b = %d\r\n", dev(a, b));
getchar();
return 0;
}
就上面的工程,在win10下选择调试之后,出现效果如图2所示。
图2 win10下调试的效果
在Linux系统下(ubuntu),调试的效果如图3所示。
图3 Linux(Ubuntu)下的调试的效果
效果已经看到了,那么下面,简单说明一下调试的配置文件了。
1、launch.json文件
2、tasks.json文件
根据GCC编译的参数的选择,我们在实际的编译过程需要将main.c中包含的xxx.h文件和xxx.c源文件包含到GCC的编译参数中,即:
图4 Vscode中命令编译示意
那么,在tasks.json中关于GCC编译的参数可以这样写:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build", // 任务名称,与launch.json的preLaunchTask相对应
"command": "gcc", // 要使用的编译器
"args": [
"${file}", //在哪个文件的视图上选择仿真,则选择哪个文件
"${fileDirname}/add/add.c",
"${fileDirname}/sub/sub.c",
"${fileDirname}/mul/mul.c",
"${fileDirname}/dev/dev.c",
"-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
"${fileDirname}/${fileBasenameNoExtension}.exe",//选择输出的文件名称,和前面的${file}是对应的,一般默认的名称就是前面的${file}.exe
"-g", // 生成和调试有关的信息
"-Wall", // 开启额外警告
], // 编译命令参数
"type": "shell", // 可以为shell或process,前者相当于先打开shell再输入命令,后者是直接运行命令
"group": {
"kind": "build",
"isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件
},
"presentation": {
"echo": true,
"reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
"focus": false, // 设为true后可以使执行task时焦点聚集在终端
"panel": "shared" // 不同的文件的编译信息共享一个终端面板
},
}
]
}
可以看到,在开始调试时候(win10环境下),在终端会打印出编译的命令,如图5所示。
图5 终端打印的信息
如果按照上述的的tasks.json配置完成后,还不能够正常调试。则可以按照在终端打印出来的信息来编辑tasks.json中下面的这些信息:
"${fileDirname}/add/add.c",
"${fileDirname}/sub/sub.c",
"${fileDirname}/mul/mul.c",
"${fileDirname}/dev/dev.c",