本文主要记录一下关于如何离线配置VScode的C/C++开发环境, 方便快速使用VScode进行代码开发,虽然一般的项目建议Visual Studio下开发,但是VScode比较好用的是轻便简洁,同时可以开发python等多种项目。
一、离线安装VScode及相应插件
1.1 离线下载开发工具并安装
官网下载VScode:https://code.visualstudio.com/Download
1.2 离线下载插件并安装
官网下载插件:https://marketplace.visualstudio.com/
下载插件后,点击扩展后点击右上角三个小点,选择从VSIX文件安装,找到.vsix文件保存路径,确定即可。
二、安装Windows下编译调试环境
Windows下VScode和VS最大的区别就是,VS是集成的IDE,安装后可以直接代码开发,编译运行,但是VScode在没配置好之前,就像一个笔记本,仅仅具有写代码文本的功能,而在Linux系统下有GNU工具集用于编译和调试,想在Windows下使用的话,一般会安装MinGW。
首先去官网下载:https://www.mingw-w64.org/,由于官网直接下载会比较慢,因此去GitHub仓库下载:
进入仓库选择合适的版本(参考上面找VScode合适插件的步骤)。仓库里有很多个文件,选择哪个作为合适的版本呢?
系统架构i686与x86_64:i686是32位架构,适用于老旧硬件和32位系统,最大支持4GB内存;x86_64是64位架构,适用于现代硬件和64位系统,性能更高,支持更大内存,同时兼容运行32位程序。
线程模型posix与win32:POSIX使用跨平台多线程实现方式POSIX标准线程库(如pthreads),适合需要代码在多个操作系统上运行的场景(如Linux、Unix、Windows等),但缺点就是性能在WIndows下可能稍逊于Win32,因为 POSIX 线程需要通过兼容层适配Windows系统;Win32使用Windows原生线程库(Windows API),性能更高,但仅限于Windows平台,代码不具备跨平台能力,难以移植到其他操作系统。
异常处理机制dwarf与seh:DWARF(Debugging With Attributed Record Formats)是一种基于调试信息的异常处理机制,主要用于32位环境(i686)。它通过生成详细的调试元数据来帮助跟踪异常和调用栈,适合调试需求较高的场景,但性能较低,程序体积较大,特别是在频繁处理异常时效率不高。SEH(Structured Exception Handling)是Windows平台的原生异常处理机制,仅适用于64位环境(x86_64)。它与操作系统深度集成,性能最高,通过直接嵌入代码流的数据结构快速处理异常,适合生产环境中的高性能程序,但不支持32位架构且跨平台兼容性较差。
运行时库msvcrt与ucrt:MSVCRT是经典的Microsoft C运行时库,适合旧版Windows,兼容性较好但功能较旧;UCRT是现代的Universal C Runtime,支持新标准,适合运行在Windows 10及更高版本上。
下载后,需要为MinGW设置环境变量,方便使用:左下角搜索“环境变量”,点击“编辑系统环境变量”,点击“环境变量(N)”,在系统变量中找变量名为path,选中,再点编辑,点击新建,把下载解压的MinGW64的bin路径复制进去,然后一直确定即可。
检查C/C++是否配置成功:win+R输入cmd,进入命令提示符Command Prompt窗口:gcc -v(C++编译器)能检测到即可。
三、简单C/C++项目的创建
3.1 新建项目工程
新建C++项目test1文件夹,使用VScode打开,文件夹下新建main.cpp文件,随便写个函数;
3.2 项目配置
VScode一般利用.vscode文件夹保存项目配置,对于C/C++项目,里面一般有三个生配置的json文件,分别为c_cpp_properties.json文件(编译器路径设置和智能提示设置)、task.json文件(编译说明)、launch.json文件(调试设置),一般不需要手动新建文件夹,完成某个文件配置后会自动生成。
首先创建c_cpp_properties.json。Ctrl+Shift+P打开命令搜索面板,选择“C/C++:编辑配置(UI)”(如果没有这个选项,可能是没安装C/C++插件或者是装错了,重新检查一遍安装步骤),进入配置UI界面,并自动生成c_cpp_properties.json文件和.vscode文件夹。
初始化配置文件中,编译器路径自动识别为刚刚安装的MinGW64的gcc.exe的路径,为了能够编译C++,需重新选择为g++.exe的路径,智能提示(IntelliSense)模式选择windows-gcc-x64。
gcc.exe:gcc.exe是GNU编译器集合中的C编译器,专门用于编译C语言代码。它默认处理.c文件并链接C标准库(如libc)。虽然它也可以用于编译C++代码,但必须显式指定-x c++参数,将.cpp文件当作C++代码进行编译。
g++.exe:g++.exe是用于编译C++程序的GNU编译器。它默认将.cpp文件视为C++代码并自动链接C++标准库(如libstdc++),支持C++的特性,如类、模板和异常。如果用g++编译.c文件,它会将其视为C代码并按C编译规则进行处理。
其次创建task.json。菜单栏选择“终端Terminal”,再选择“配置任务”,最后点击“C/C++:g++.exe生成活动文件”,就会自动在.vscode文件夹下生成task.json文件。
配置launch.json文件(可省略)。点击左侧工具栏的“调试按钮”,再点击“创建launch.json文件”,最后选择“C/C++(GDB/LLDB)”,就会自动生成launch.json文件(目前用不到GDB,暂时不配置,仅保留初始文件内容)。
3.3 编译和执行
首先对main.cpp编译。鼠标选中待编译的cpp代码,然后菜单栏选择“终端”,点击“运行生成任务”,也可直接ctrl + shift + B,选择“C/C++:g++.exe生成活动文件”(因为配置了task.json,所以选择配置任务或者检测到的任务都可)。
终端显示如下内容即编译成功:
编译成功后会在项目文件目录下生成exe执行文件:
接下来执行编译生成的可执行文件。菜单栏选择“终端”,点击“新建终端”,也可直接ctrl + shift + `,新建一个终端,然后使用“.\ + filename”执行可执行文件,filename为编译生成的可执行文件名。
3.4 多源文件(.cpp)编译与执行
假如设置一个调试打印函数,能够输出打印所在文件,所在行以及输出参数,完成.h声明和.cpp的定义后,在主函数main中调用:
按照上面单文件的方式,直接对test1.cpp编译生成会报错:
此时就需要修改项目编译的配置文件c_cpp_properties.json和编译的说明文件tasks.json。首先要明白tasks.json和tasks.json中各个部分的作用:
/* IntelliSense 是一种由Microsoft提供的智能代码补全、错误检查、代码导航和提示的技术 */
{
"configurations": [
{
"name": "Win32",
"includePath": [ /* 指定包含路径,用于告诉 IntelliSense 哪些目录可以找到头文件 */
"${workspaceFolder}/**" /* ${workspaceFolder}/表示根目录;**表示递归匹配当前目录及其所有子目录。 */
],
"defines": [ /* 定义预处理器宏,用于条件编译 */
"_DEBUG", /* 用于区分调试模式和发布模式 */
"UNICODE", /* 指示程序使用 Unicode 字符集 */
"_UNICODE"
],
"compilerPath": "D:/MinGW64/bin/g++.exe", /* 指定编译器的路径,供 IntelliSense 使用 */
"cStandard": "c17", /* 指定C语言的标准,供 IntelliSense 解析C代码时使用 */
"cppStandard": "gnu++17", /* 指定C++的标准版本,表示C++17标准,同时支持GNU扩展 */
"intelliSenseMode": "windows-gcc-x64" /* 指定 IntelliSense 的目标平台、编译器、目标架构 */
}
],
"version": 4
}
因此,要想编译成功,首先得告诉编译器函数调用所需头文件在哪,即includePath中加入函数头文件所在路径(由于上述示例添加的函数头文件和test1.cpp在同一目录,且都位于根目录,所以c_cpp_properties.json无需修改)。
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild", /* 任务类型:用于构建C/C++项目 */
"label": "C/C++: g++.exe 生成活动文件", /* 任务名,用于识别和运行该任务(ctrl+shift+B所看到的名称) */
"command": "D:/MinGW64/bin/g++.exe",
"args": [ /* 传递给命令的参数列表,此数组包含了编译任务所需的所有命令行参数。 */
"-fdiagnostics-color=always", /* 启用颜色输出,便于查看编译时的警告和错误信息 */
"-g", /* 告诉编译器生成调试信息 */
"${file}", /* 代表当前活动文件(即正在编辑的C/C++源文件) */
"-o", /* 指定输出文件的路径 */
"${fileDirname}\\${fileBasenameNoExtension}.exe" /* 指定生成的可执行文件的路径和名称,${fileDirname}当前文件目录,${fileBasenameNoExtension}当前文件名称(不包含扩展名),生成.exe */
],
"options": {
"cwd": "D:/MinGW64/bin" /* 指定任务的当前工作目录,执行任务时,会在这个目录下运行命令(用于找寻编译器或执行路径) */
},
"problemMatcher": [ /* 指定与编译器输出匹配的错误和警告格式 */
"$gcc"
],
"group": "build", /* 任务分组,用于将多个任务组织在一起,build表明用于构建(编译)代码的任务 */
"detail": "编译器: D:/MinGW64/bin/g++.exe" /* 任务更多的描述信息,帮助开发者理解 */
}
]
}
在tasks.json中,当前的配置只编译了一个源文件${file}(当前正在编辑的文件或者说是鼠标选中的文件)。为了编译多个源文件,需要手动列出所有要编译的源文件,并传递给编译器。同时也需要重新指定生成任务的路径和名称,在args中修改如下:
"-g", /* 告诉编译器生成调试信息 */
"${workspaceFolder}/test1.cpp",
"${workspaceFolder}/debug.cpp",
"-o",
"${workspaceFolder}/test1.exe"
然后运行生成任务(ctrl + shift + B),编译成功,执行:
四、VScode平台开发配置
4.1 代码格式化
内置格式化工具手动格式化:Shift + Alt + F对当前文件格式化,支持大部分主流编程语言;
内置格式化工具自动格式化:设置文件settings.json
中进行配置或直接设置中勾选设置,ctrl + ,进入设置,搜索“format on”,勾选对应选项即可。