VS Code 配置 C 开发和调试环境(超级详细)
一 为Windows安装C编译器(MinGW-W64 GCC)
<略>
参考之前的文章:Windows下安装C编译器MinGW
二 安装并配置Visual Studio Code
下载VSCode,下载地址为:https://code.visualstudio.com/,在网页中点击”Download for Windows“按钮即可下载。当然,还可以点击按钮右侧紧挨的向下的箭头选择不同操作系统的VSCode版本。
下载下来是一个exe的安装文件,VSCodeUserSetup-x64-<version>.exe
。
VSCode的安装比较简单,根据提示一路下一步
完成安装,完成后在开始菜单下就会有“Visual Studio Code”了,点击打开。
打开后,如下图。左侧边栏是几个快速的按钮,点击最下面的“Extensions”(扩展)按钮。
在随后出现的”扩展市场“的搜索框中输入”C/C++“,在随后出现的列表中选择对应的扩展,确认是Microsoft发布的,就点击”Install“按钮即可安装。
等待一会,出现uninstall按钮就代表安装完成了。
安装完”C/C++"扩展后,安装“Code Runner”扩展,方法相同。
两个扩展安装完成后,对“Code Runner”扩展进行配置,在“File”菜单下找到“Preference”再找到“Settings”子菜单或者直接使用快捷方式CTRL+,
。
依此找到"Extensions"->"Code Runner Configuration"。并勾选:
- Run in Terminal
- Save All File Before Run
- Save File Before Run
VSCode及其扩展的安装、配置就完成了。
三 开发C语言工程
在你喜欢的位置创建一个文件夹,建议使用纯英文字符的名。
随后,打开VSCode,然后在”File“菜单下找到”Open Folder“子菜单,并点击。
定位到刚刚创建的新文件夹,然后点击”选择文件夹“按钮。
当然,如果你刚打开VSCode,没有选定文件夹,它也会出现一个”Open Folder“按钮,你通过这个按钮选择刚刚创建的文件夹效果是一样的。
选择”Yes,……“。
鼠标移动到打开的文件夹处会出现4个快捷按钮,点击左边第一个就可以给文件夹创建一个新的文件,命名为”hello.c“。
在”hello.c“文件中输入代码;比如:
#include <stdio.h>
int main(){
printf("hello world! I\' m xiamingliang。\n");
return 0;
}
并保存。
四 配置编译和Debug设定
重点来了,代码编辑完成后还不能直接运行。还需要配置两个json文件。
- tasks.json 用来是设置指令编译代码。
- launch.json 设置执行环境来执行代码。(如果不设置每次点击调试的时候都需要手动选择debugger)
tasks.json配置文件
首先,在”Terminal“菜单下点击”Configure Tasks...”子菜单。在随后出现的弹出框中选择“C/C++:gcc.exe生成活动文件”
随后,在“MyC”文件夹中会自动生成一个“.vscode"的子文件夹,在这个子文件夹下自动创建一个”tasks.json“的文件。
不用做任何改动。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "D:\\MinGW\\C\\mingw64\\bin\\gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: D:\\MinGW\\C\\mingw64\\bin\\gcc.exe"
}
]
}
最后,回到“hello.c”文件,单击鼠标右键选择“Run Code”即可运行代码。
运行结果会在下面出现的“Terminal”中显示;这里乱码是使用了中文的字符导致的,先忽略吧。
如果想要调试代码的话呢?点击“Run”菜单下的“Start Debugging”子菜单或者使用F5
快捷键。
在随后出现的弹出框中选择“C++(GDB/LLDB)”,再选择”gcc.exe“。
这个时候就可以进入调试,如果我们将代码改一下,并设置断点。
这个时候,进入调试(F5快捷键)如下:运行到scanf那一行后在terminal中等待我们输入,假设输入“10,20",然后回车。
F10执行下一行。
当然,也可以在调试的时候使用”DEBUG CONSOLE“进行适当指令的输入以检查程序是否按照我们的设想在执行。
launch.json配置文件
为了避免每次调试都要选择”Debugger”,我们再“Run”->"Add Configuration..."
vscode会自动帮我们生成launch.json配置文件。
我们需要修改这个配置文件以匹配我们当前的环境。
内容比较多,参考这里(直接复制粘贴):
卖个关子,这里有坑!!
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "MyLaunch", // 强制:就一个名字而已,但是是必须要有的(取任意自己喜欢的名字即可)
"type": "cppdbg", // 强制:调试器的类型,Node debugger for node, php for PHP , go for GO (C语言就固定是cppdbg)
"request": "launch", // 强制:launch/attach
"program": "${workspaceFolder}/${fileBasenameNoExtension}.out", // 可执行文件的路径
"miDebuggerPath": "D:\\MinGW\\C\\mingw64\\bin\\gcc.exe", // 调试器的位置(根据实际情况调整)
"preLaunchTask":"build", // 强制:调试前编译任务名称(要和tasks.json中的lable字段一样)
"args": [], // 调试参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 当前工作目录
"environment": [], // 当前项目环境变量
"externalConsole": true,
"MIMode": "gdb", // 调试器模式/类型
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
排个错
上面的配置下有问题:
Could not find the task 'build'.
明天排查!!!!
继续:
提示已经说到问题的重点了,找不到task(名字叫build);原因是tasks.json中代表task名字的字段lable默认是
"label": "C/C++: gcc.exe 生成活动文件",
而launch.json中指定的preLaunchTask字段却是
"preLaunchTask":"build",
导致vscode认为找不到名字叫build的task。
因此,解决把方法就是;修改tasks.json或者launch.json使
launch.json的preLaunchTask字段和tasks.json的lable字段值一致即可。
我这里调整下launch.json的preLaunchTask字段
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "MyLaunch", // 强制:就一个名字而已,但是是必须要有的(取任意自己喜欢的名字即可)
"type": "cppdbg", // 强制:调试器的类型,Node debugger for node, php for PHP , go for GO (C语言就固定是cppdbg)
"request": "launch", // 强制:launch/attach
"program": "${workspaceFolder}/${fileBasenameNoExtension}.out", // 可执行文件的路径
"miDebuggerPath": "D:\\MinGW\\C\\mingw64\\bin\\gcc.exe", // 调试器的位置(根据实际情况调整)
"preLaunchTask": "C/C++: gcc.exe 生成活动文件", // 强制:调试前编译任务名称(要和tasks.json中的lable字段一样)
"args": [], // 调试参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 当前工作目录
"environment": [], // 当前项目环境变量
"externalConsole": true,
"MIMode": "gdb", // 调试器模式/类型
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
再次执行debug(右上角的小虫子或者F5或者"Run"->"Start Debuging")
选择MyLaunch;他是我们在launch.json中指定的name。
再次出现报错:
继续排错
报错信息:
launch: program 'D:\MyC\hello.out' does not exist
有经验的童鞋很明显可以看出debug过程中准备执行"D:\MyC\hello.out",但是这个文件不存在;为什么会这样呢?
还是因为tasks.json和launch.json中的字段互相没关联起来导致的。
tasks.json中指定-o输出的文件名后缀是exe:
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
而launch.json中准备执行的文件后缀却是out:
"program": "${workspaceFolder}/${fileBasenameNoExtension}.out", // 可执行文件的路径
因此,解决办法是修改两个配置文件中的任意一个使他们的后缀保持一致即可,我们还是调整launch.json的program字段;修改后的配置文件为:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "MyLaunch", // 强制:就一个名字而已,但是是必须要有的(取任意自己喜欢的名字即可)
"type": "cppdbg", // 强制:调试器的类型,Node debugger for node, php for PHP , go for GO (C语言就固定是cppdbg)
"request": "launch", // 强制:launch/attach
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", // 可执行文件的路径 (根据实际情况调整需与tasks.json中的-o输出文件一致)
"miDebuggerPath": "D:\\MinGW\\C\\mingw64\\bin\\gcc.exe", // 调试器的位置
"preLaunchTask": "C/C++: gcc.exe 生成活动文件", // 调试前编译任务名称
"args": [], // 调试参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 当前工作目录
"environment": [], // 当前项目环境变量
"externalConsole": true,
"MIMode": "gdb", // 调试器模式/类型
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
保存并验证。
又遇到报错:
继续排错
报错信息:
主要信息:
gcc.exe: error: unrecognized command line option '--interpreter=mi'
原因:
这里其实是网上某些教程的错误导致的;launch.json中指定的调试器位置应该指向gdb.exe而不是gcc.exe;
因为gcc.exe是编译程序主要作用是将文本内容的.c源码转换为可执行的程序.exe(一般习惯),
gdb.exe才是用来程序进行调试的工具。
"miDebuggerPath": "D:\\MinGW\\C\\mingw64\\bin\\gcc.exe", // 调试器的位置
因此,需要将launch.json中的"miDebuggerPath"修改为:
"miDebuggerPath": "D:\\MinGW\\C\\mingw64\\bin\\gdb.exe", // 调试器的位置
最终解决办法(lauch.json的完整配置):
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "MyLaunch", // 强制:就一个名字而已,但是是必须要有的(取任意自己喜欢的名字即可)
"type": "cppdbg", // 强制:调试器的类型,Node debugger for node, php for PHP , go for GO (C语言就固定是cppdbg)
"request": "launch", // 强制:launch/attach
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", // 可执行文件的路径 (根据实际情况调整需与tasks.json中的-o输出文件一致)
"miDebuggerPath": "D:\\MinGW\\C\\mingw64\\bin\\gdb.exe", // 强制:调试器的位置(特别注意:根据实际情况调整,且代表的是gdb.exe调试器程序的位置而不是编译器gcc.exe的位置。)
"preLaunchTask": "C/C++: gcc.exe 生成活动文件", // 调试前编译任务名称
"args": [], // 调试参数
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 当前工作目录
"environment": [], // 当前项目环境变量
"externalConsole": true,
"MIMode": "gdb", // 调试器模式/类型
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
再次验证。
坑已填完,顺利上岸!!