本文主要讲解 VS Code 安装之后如何配置C++调试环境,使用的编译器是MinGW-w64。笔者是个新手,文章可能比较简单直白,不能面面俱到,还请多多包涵。
MinGW有两个版本,一个是MinGW,已经很久没更新了;另一个是MinGW-w64,一直在更新,比较推荐用这一个。安装过程可以自己查或者看一下我写的安装过程记录:MinGW-w64 离线安装过程记录
点击 VS Code 左边的“扩展”按钮,安装“C/C++”插件(想要中文的话可以安装Chinese插件)
打开或新建一个文件夹,这个文件夹是 VS Code 的工作目录,需要打开一个文件夹才能继续下面的操作。
新建一个cpp文件,随便写点什么。(在开始各种设置之前,这里可能会报一些错误)
据笔者个人经验,c_cpp_properties.json文件关系到编写代码的时候能否自动查找头文件、能否显示函数或变量的提示信息和能否实时检查出代码的语法错误等,这些都需要头文件和编译器的支持。在没有c_cpp_properties.json文件的情况下,默认会使用Visual Studio的相关配置。如果现在有找不到头文件的错误提示也没有关系,可以修改一下配置文件解决。如果没有错误,可以跳过这一步或同样修改成MinGW的相关配置(与生成任务保持一致)。
F1 或 Ctrl+Shift+P: 打开命令面板。在命令面板输入e,选C/C++:Edit configurations…
VS Code 自动生成c_cpp_properties.json配置文件。"name"是配置名字,会显示在界面的右下角。这里可以是Mac、Linux或Win32,这三个名字可以使得在不同平台自动选择不同的配置,也可以自己随便写,我写了MinGW-w64。include目录我添加了MinGW的C++include目录,笔者发现C++的include目录就已经包含了C的include目录,那就不用重复添加C的目录了。"defines"是预定义宏,按需修改或者就保持默认好了。"windowsSdkVersion"也是按需修改或者保持默认好了。"compilerPath"是编译器路径,改成MinGW的g++.exe的路径(如果写C就改成gcc.exe的路径)。"cStandard"和"cppStandard"可以自己查一下或者保持默认就好了。“intelliSenseMode” 选gcc-x64,原来的msvc-x64不合适。改好了大概就像下面这样:
//c_cpp_properties.json
{
"configurations": [
{
"name": "MinGW-w64",
"includePath": [
"${workspaceFolder}/**",
"C:/MinGW-w64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"C:/MinGW-w64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
"C:/MinGW-w64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/backward",
"C:/MinGW-w64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include",
"C:/MinGW-w64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/include-fixed",
"C:/MinGW-w64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.17763.0",
"compilerPath": "C:/MinGW-w64/bin/g++.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
提示:如果不知道MinGW的include路径的话,可以运行CMD,输入指令获得:
C的include路径:gcc -v -x c -E -
C++的include路径:g++ -v -x c++ -E -
配置生成任务意思是配置编译的具体操作,由 VS Code 自动执行。其实就是将手写编译命令先写好保存下来,交给程序自动执行。
点击菜单栏的"终端(T)",选择"配置默认生成任务…",选择"使用模板创建tasks.json文件",选择"Others"模板。(这里有点小bug,第一次生成的tasks.json文件不是默认生成任务,需要重复一次刚刚的操作,选择echo任务,它才成为默认生成任务。)程序将自动生成名为"echo"的默认生成任务,它在终端输出一句"Hello"。可以用Ctrl+Shift+B执行默认生成任务,可以看到终端有两行英文,第二行输出了一句"Hello"。接着可以修改这个任务为我所用了。
"label"是任务名称,会在选择任务和终端显示,可以改成build、Compile或者其它。"type"定义任务是作为进程运行还是在shell中作为命令运行,这里是作为命令运行。"command"是在shell中执行的命令,这里命令是g++(C是gcc)。模板中没有给出参数,手动添加"args"并填写g++命令的参数。参数有很多,这里只写了最简单的参数,如果需要的话可以自行修改。
"args": ["-g","${file}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"]
//-g:添加gdb调试选项
//${file}: cpp文件的路径+文件名+后缀
//-o: 指定生成可执行文件的名称
//${fileDirname}: cpp文件的路径,不含文件名
//${fileBasenameNoExtension}: cpp文件的文件名,不含后缀
"group"定义此任务的执行组,“kind”: “build”,“isDefault”: true 表示它是默认生成任务。
修改完成后大概是下面这个样子:
{
"version": "2.0.0",
"tasks": [
{
"label": "Compile",
"type": "shell",
"command": "g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
配置完成后可以打开cpp文件,用Ctrl+Shift+B执行默认生成任务试一下了。(有个小问题,这个快捷键和微软中文输入法冲突。)生成exe后可以手动运行一下,想要在 VS Code 进行调试,看下一步。
如果现在尝试Debug,会提示没有配置。进入调试模式,点上面的小齿轮添加配置,选择C++GDB环境,它会自动生成一个launch.json文件。
launch.json需要改的地方不多,其中program和miDebuggerPath是必须更改的。program表示可执行程序的名字,启动调试的时候按着这一条信息来找到调试的可执行程序,所以这里应该跟编译时候写的名字保持一致。miDebuggerPath表示调试工具的路径,这里写MinGW的gdb路径,如/MinGW-w64/bin/gdb.exe。externalConsole表示调试的时候是否弹出控制台窗口,如果写false,控制台窗口出现在 VS Code 界面右下方一小块区域。
其它的我都是保持默认:"name"调试配置的名字,如果只有一个配置的话改不改都无所谓了。"type"配置类型,保持默认即可。"request"可以是启动launch或附加attach,这里是启动。"args"是调试时传给程序(main函数)的参数,平时保持空即可,需要的时候再改。"stopAtEntry"是否在程序入口处暂停。"cwd"英文解释是工作目录,调试的工作目录就是可执行程序的目录吧,不太清楚,保持默认好了。"MIMode"可选gdb和lldb,这里选gdb,lldb是苹果的。"setupCommands"里面有开启pretty-printing的指令,可以在调试的时候直观地看到STL的内容(我们真正想看到的)而不是具体的成员变量(很多多余的信息)。
改好了差不多是下面这个样子:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:/MinGW-w64/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
现在可以调试一下,看是否成功了。打开cpp文件,按Ctrl+Shift+B进行编译,按F5进行调试。