由于Visual Studio安装即用,门槛低,便于调试,且最开始入门一直使用VS,所以在windows平台一直使用Visual Studio进行开发,但是Visual Studio的体积过于庞大,而且VS的免费的插件较少。反观VS Code其存在众多的插件,可以满足各种开发需求,可以极大地提高开发效率,所以最终还是决定转战VS Code。本文将详细讲解使用VS Code进行C/C 开发的相关配置。
1. 下载和安装
VS Code的下载地址如下:https://code.visualstudio.com/Download,单击进入到如下的下载界面
依据自己的需求,下载对应平台及芯片要求的VS Code版本。下载完成后,直接安装即可。由于安装简单,本文不再赘述。
2. 汉化
VS Code默认是英文界面,如果期望使用中文界面,可以通过扩展(或称为插件,两者等同)将VS Code界面汉化。
使用快捷键(Ctrl shift X)或者单击左侧的扩展按钮,打开扩展应用商店界面,在搜索栏输入chinese,即可找到中文插件,单击安装即可。插件安装成功后,重启VS Code便发现界面显示为中文了。
3. 环境准备
由于VS Code只是编辑器,其默认不支持C/C 开发,所以使用VS Code进行C/C 开发时,需要借助插件,并需要配置编译器和调试器。
3.1 安装C/C 扩展
安装C/C Extension Pack插件可以参考安装汉化——Simple Chinese扩展的步骤,在搜索栏输入c ,即可找到相关插件,单击安装即可。
3.2 配置编译器和调试器
编译器和调试器可依据自己需求进行选择,如之前安装了VS,便可使用VS的编译器和调试器;或者,使用MinGW的编译器和调试器都是可以的。
如此,在windows平台既可以使用MinGW,也可以使用Visual Studio的编译器和调试器,本文将分别讲解这两种配置方式。
配置VS
VS Code使用VS的编译器和调试器时存在一个前提——VS正确安装。由于VS Code限制仅当从VS开发人员命令提示符处运行 VS Code 时,cl.exe生成和调试才可用。为避免每次使用VS进行调试时都需要从VS开发人员命令提示符处运行VS Code,可以编写一个bat文件,只要执行该脚本便可保证VS Code是从VS开发人员命令提示符处运行。注意,引号中的路径需要依据本地的实际安装路径填写。
代码语言:javascript复制@echo off
call "C:Program FilesMicrosoft Visual Studio2022CommunityVCAuxiliaryBuildvcvarsall.bat" x64
code
使用如上脚本打开VS Code后,打开项目所在的文件夹,便做好了使用VS进行编译和调试的基础配置。
配置MinGW
首先需要下载并解压MinGW,下载地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/,下载后解压到任意位置,然后配置环境变量——将bin目录添加到path中。小编将下载文件解压后放到D盘,如下图所示,便将D:mingw64bin添加到path中。
环境变量配置完成后,可以使用cmd打开终端,输入如下命令,如果出现正确路径,则表明配置成功。
代码语言:javascript复制where gcc
where g
综上,既可以使用VS和MinGW进行编译和调试,切记使用VS的编译器和调试器时需要使用如上的脚本从VS开发人员命令提示符处启动VS Code。
4. 单文件项目
存在如下的单文件项目,其中包含一个main.cpp文件,该文件中包含一个main函数,用于打印“Hello World!”。
4.1 运行
进入到.cpp文件或.c文件,单击运行按钮(上图绿框),将会弹出调试配置下拉框,或者使用Ctrl Shift P打开命令面板,输入“调试配置”,选择“添加调试配置命令”,弹出如下的调试配置界面,选择g 或cl.exe,单击确定即可。
单击运行按钮(上上图绿框),即可在终端输出“Hello World!”。
此时会生成task.json文件,由于小编同时配置了MinGW和VS,所以会生成两个task任务,如下所示:
代码语言:javascript复制{
"tasks": [
{
"type": "cppbuild",
"label": "C/C : g .exe 生成活动文件",//唯一的名称,可修改为唯一的任意名称,调试时有用
"command": "D:\msys64\mingw64\bin\g .exe",//编译器所在目录的全路径
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",//源文件
"-o",
"${fileDirname}\${fileBasenameNoExtension}.exe"//生成可执行程序的目录和名称,按需修改
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": false//是否为默认任务,true为是,false为否
},
"detail": "调试器生成的任务。"
},
{
"type": "cppbuild",
"label": "C/C : cl.exe 生成活动文件",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe${fileDirname}\${fileBasenameNoExtension}.exe",//生成可执行程序的目录和名称
"${file}"//源文件
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
此时单击运行按钮即可运行程序。修改task.json文件中的isDefault属性,可以修改默认的任务,当isDefault为true时为默认的任务。
4.2 调试
在.cpp文件或.c文件中,单击左侧运行和调试按钮(下图红框所示)或快捷键(Ctrl Shift D)打开运行和调试界面,
由于之前配置了task.json文件,如果单击运行和调试按钮,弹出下拉框,用于选择调试器,既可以选择g 也可以选择cl.exe。进行调试。
在运行和调试界面支持不同调试的切换,但是仅在下次启动调试时生效,不支持在调试过程中切换调试器。如下图:
虽然如上的调试可以满足单文件调试需求,但是VS Code支持配置launch.json进行自定义运行和调试。
小编配置的launch.json文件如下:
代码语言:javascript复制{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) 程序员的园启动",//配置的名称
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\${fileBasenameNoExtension}.exe",//可执行程序路径,与task.json中的输出路径一致
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"console": "externalTerminal",//使用外部终端
"preLaunchTask": "C/C : cl.exe 生成活动文件"//task.json中对应的task label
},
{
"name": "(gdb)程序员的园启动",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\${fileBasenameNoExtension}.exe",//可执行程序全路径,与task.json中的输出路径一致
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,//是否在外部终端输出
"MIMode": "gdb",
"miDebuggerPath":"D:\msys64\mingw64\bin\gdb.exe",//调试器全路径,
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C : g .exe 生成活动文件"//task.json文件中对应的task label
}
]
}
注:如上的任意标签不存在时,均可以自主添加,如preLaunchTask标签默认不存在,自行添加即可。
当配置完launch.json文件后,运行和调试界面可出现自定义的调试配置,如图:
5. 多文件项目
在单文件的基础上,增加一个add函数于add.h和add.cpp文件中,其中add.h文件中进行add函数的声明,add.cpp
文件中进行add函数的定义,main.cpp文件中调用add函数,并输出结果。整体的文件布局如下:
此时若直接使用单文件的task.json和launch.json文件,会出现找不到add函数的错误,此时仅需要修改task.json文件,告知编译器此时的源文件不再是main.cpp,而是main.cpp、add.cpp两个文件。修改方法为修改源文件“${file}”为"*.cpp",便可如单文件一样,可以进行运行和调试。仅以g 为例,修改后的task.json文件如下:
代码语言:javascript复制{
"type": "cppbuild",
"label": "C/C : cl.exe 生成活动文件",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe${fileDirname}\MSVC\test.exe",
"*.cpp"//注意此处
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": false
},
"detail": "调试器生成的任务。"
}
同一文件夹下的单文件和多文件的区别为源文件的选择,单文件选择“${file}”,多文件选择“*.cpp”。
6. 多文件夹项目
在多文件项目中新增了add.h和add.cpp文件,由于其作为独立的功能,不应该和main放在一起,为此,新建add文件夹用于存储add.h和add.cpp文件,此时文件布局如下:
无论是多文件项目还是多文件夹项目,对比单文件项目而言,仅仅是文件的数量变多了,需要让编译器知晓源文件的位置,并将其编译到项目中。只是多文件夹项目不同多文件项目,多文件项目由于不同的文件在一个文件夹内,只需要修改为模糊检索即可。而多文件夹项目,需要告知编译器源文件存在于不同的文件夹内,为此,需要追加args参数,告知编译器源文件的位置。此处以VS配置为例,修改器task.json文件中对应的task如下:
代码语言:javascript复制{
"type": "cppbuild",
"label": "C/C : cl.exe 生成活动文件",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe${fileDirname}\MSVC\test.exe",
"*.cpp", "add/*.cpp"//注意此处
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
上例以单个子文件夹为例,若存在多个文件夹,继续向后追加即可。
7. 总结
本文主要介绍了VSCode在Windows平台下的C/C 环境搭建,包括单文件、多文件和多文件夹项目,以及如何配置task.json和launch.json文件,以实现C/C 的运行和调试。
至于VS Code生成lib、dll,以及使用使用第三方库不再赘述,因为单纯的使用task.json和launch.json完成如上工作较复杂,也没有太多价值,因为可以借助cmake来实现上述功能,该部分将在下一章节中书写。