VS Code 配置 C/C++ 编程运行环境
1.MinGW-64
1.1 什么是MinGW-64
MINGW64 的全称是 Minimalist GNU for Windows 64-bit,其主要目标是提供一个最小化的、可以运行 GNU 工具链的 Windows 环境。它包括了许多常见的 GNU 工具和库,如 GCC、G++、GDB(GNU Debugger,GNU 调试器)等,以及一个 Windows 兼容的 POSIX API 实现。这些工具允许开发者在 Windows 上编写、编
1.2 下载MinGW-64
1.2.1 官网下载二进制文件
MinGW-64的官方github地址:Releases · niXman/mingw-builds-binaries
下面演示如何从官网找到该地址,首先进入官网:mingw-w64
点击Downloads→Pre-built Toolchains→MinGW-W64-builds
会自动往下跳转到github的地址,点击跳转

到了github之后发现有很多款式,不指定该怎么选
我们选最后一个就行

以上部分说明
13.2.0:是GCC的版本号; 目标操作系统和API风格32:位的操作系统,选择i686,64位的操作系统,选择x86_64;posix:这是为类Unix系统(如Linux和macOS)设计的API风格。如果你的程序需要在这些系统上运行,或者你的代码依赖于POSIX API,你应该选择带有posix的工具链。win32:这是为Windows系统设计的API风格。如果你的程序主要面向Windows用户,或者你的代码依赖于Windows特有的API,你应该选择带有win32的工具链。 异常处理机制sjlj:表示这个工具链使用“Setjmp/Longjmp”异常处理机制。SJLJ是一种更传统的异常处理方式,它通常用于那些不支持或不完全支持Windows结构化异常处理(SEH)的操作系统。seh:表示这个工具链使用Windows的结构化异常处理(Structured Exception Handling, SEH)。SEH是Windows平台上常用的异常处理机制,它提供了更丰富的异常信息和更灵活的异常处理逻辑。如果你的代码需要与Windows平台的特性紧密集成,或者你的程序主要运行在Windows上,SEH可能是一个更好的选择。ucrt:是Universal C Runtime的缩写,它是Windows 10及更高版本中包含的一个新运行时库。它提供了与操作系统更紧密集成的API,并通常用于更现代的Windows应用程序。 如果你的目标平台是Windows 10或更高版本,并且你希望利用最新的API和功能,ucrt可能是一个好选择。 使用ucrt的库通常比使用msvcrt的库更小,因为它们不包含一些旧的、不再需要的API。msvcrt:是Microsoft C Runtime的缩写,它是Microsoft提供的传统C运行时库。 它提供了广泛的API支持,包括一些旧的、可能不再常用的API。 如果你的代码依赖于msvcrt特有的API,或者你需要确保你的程序能在较旧的Windows版本上运行,msvcrt可能更适合你。rt_v11:,通常指的是“runtime”,即运行时库版本号。.7z:这是文件的压缩格式。.7z是7-Zip压缩工具使用的文件格式。它表示文件已经被压缩,以减小文件大小,方便下载和存储。要使用文件中的内容,用户通常需要使用7-Zip或其他兼容的压缩工具来解压缩文件。
1.2.2 解压
下载完之后找一个合适,并且记得住的地方解压
比如我在D盘下新建了一各environment的文件夹,放在里

1.3 配置环境变量
按键盘Win键,搜索环境变量,找到编辑系统环境变量并打开

点击环境变量

找到Path双击打开

接下来有两种方法配置环境变量,新手任选其一即可,老手。。。老手应该早都会了,还看个蛋
1.3.1 方法一
找到刚才我们mingw-64文件夹的路径,并找到bin目录
直接将地址栏的目录复制

然后回到刚才编辑环境变量的窗口,点击新建按钮,然后把路径复制到新建的那一行

然后确定三连

TIP
这种方法步骤少,简单直观对初学者最省事
但是也有缺点
- 路径硬编码,换安装目录或升级版本要改 Path
- Path 里一堆绝对路径,不易辨认是哪个软件
- 某些构建脚本 / IDE(如 CMake、Qt Creator、某些 Makefile)会主动读取
MINGW_HOME/MINGW64_HOME,找不到可能要多配
这是ai说的,我管你这那的
1.3.2 方法二
依然是在环境变量这一步,注意是第二个窗口,点击新建按钮
- 然后顶一个变量名,按照常规管理,环境变量名都以
XXX_HOME这样的格式命名 - 那我们就命名为
MinGW_HOME - 然后把
mingw64文件夹的路径复制到变量值一行,注意这次不是bin目录

添加完变量后,点击确定

此时看到用户变量一栏已经有我们刚才创建的变量了

接下来依然是找到Path并打开

点击新建,填入%MinGW_HOME%

然后依然是确定三连

1.4 验证环境变量
win+x->a,打开终端PowerShell,分别输入以下指令然后回车
gcc --version
g++ --version
gdb --version
结果和截图差不多就行,若报错了,再仔细从头看一遍看哪里错了
TIP
gcc:GNU Compiler Collection(GNU 编译器套件):是一个编译器集合,在这里的主要作用是把c源代码编译成可执行程序
g++:用于编译 C++
gdb:用来调试程序可以:
- 单步执行
- 设置断点
- 查看变量值
- 查看函数调用栈
- 分析程序崩溃(core dump)
2.MSYS2
在MinGW-64官网中,如果我们往下看,可以看到除了MinGW-64的github地址,还有MSYS2和w64devkit

那么这都是什么东西呢
- MinGW-w64:编译器工具链(项目本身)
- MinGW-w64 是一个开源项目,提供 Windows 平台的 GNU 工具链头文件、导入库和运行时,让 GCC/Clang 能在 Windows 上编译出原生 Windows 程序(.exe,不依赖 Cygwin DLL),支持 32 位和 64 位
- w64devkit:MinGW-w64 的极简便携发行版
- w64devkit(由 skeeto 维护)是一个精心打包好的 MinGW-w64 + GCC 工具链压缩包,解压即用:
- 内含:MinGW-w64 GCC(gcc/g++)、GDB、GNU Make、busybox(提供 sh/ls 等 Unix 命令)、Vim、Ccache
- 零安装:绿色软件,不写注册表,删文件夹即卸载
- 适合:快速搭环境编译 C/C++、CI 构建、U盘随身携带
- w64devkit(由 skeeto 维护)是一个精心打包好的 MinGW-w64 + GCC 工具链压缩包,解压即用:
- MSYS2:带包管理器的类 Unix 开发平台
- 提供 bash shell、git、autotools 等 Unix 工具
- 通过
pacman一键安装/更新 GCC、Clang、CMake、FFmpeg、OpenSSL 等数千个包 - 包含多个子环境(可共存):
- UCRT64(推荐新项目):x86_64 + UCRT + GCC
- MINGW64/MINGW32:传统 MSVCRT 运行时
- CLANG64:Clang 编译器
- MSYS:运行依赖 msys-2.0.dll 的 Unix 工具(用于构建脚本,不用于最终程序)
这些屁话看不看无所谓,反正使用vscode开发c/c++,MinGW-64、MSYS2、w64devkit其中各选其一即可
那么接下来就是如何下载MSYS2
2.1 下载MSYS2
进入官网:MSYS2
直接可以看到下载按钮,直接点击下载

或者直接来到github的release来一顿酣畅淋漓的下载:https://github.com/msys2/msys2-installer/releases/

下载之后图标是这样的

我们直接打开安装
点击Next

选择安装目录,我还是放在了D盘的environment下,然后点击next
这个路径也要记住,待会要找

继续下一步

然后等待下载

勾选Run MSYS2 now,应该是默认勾选
然后点finish

接下来会自动打开一个终端页面,运行如下指令
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain出现这个界面,直接按回车键,默认接受所有的安装包。

然后输入y并回车

等所有都下载完毕后,就可以关闭窗口了

2.2 配置环境变量
找到我们刚才安装的目录,然后进入ucrt64->bin

接下来就是跟上面一样了[方法一](#1.3.1 方法一)
或者走到bin的上一级走[方法二](#1.3.2 方法二)

之后依然是走验证[验证环境变量](#1.4 验证环境变量)
3.w64devkit
w64devkit 的意思是:Windowsx64/x86的dev(开发)kit(工具)包,工具包中包含了下面9个工具。
mingw-w64 GcC:compilers, 1inker, assemblerGDB : debuggerGNU Make: standard build toolCMake with Ninja: build systembusybox-w32: standard unix utilities, including shVim: powerful text editorUniversal ctags: source navigationCcache:compiler cache
直接来到github下载页面:Releases · skeeto/w64devkit
选择带x64的下载

下载好的图标长这样,直接双击打开安装

选择安装目录,点击Extract

4.下载VsCode插件
主要下载两个插件

- C/C++:C/C++最基础的扩展,提供语法高亮、代码补全等功能
- C/C++ Extension Pack:
- 语法高亮:通过C/C++ Themes插件,可以使代码具有更易于阅读的颜色主题,提高代码的可读性。
- 代码补全:C/C++插件提供了智能的代码补全功能,可以根据上下文自动补全代码,加快编码速度。
- 代码调试:集成了调试工具,允许开发者在VSCode中直接进行代码调试,提高了调试效率。
- CMake支持:CMake和CMake Tools插件为使用CMake构建系统的项目提供了便捷的支持。
- 改进的C++语法:Better C++ Syntax插件提供了更好的C++语法支持,使得语法高亮和代码格式化更加准确。
5.单文件运行
创建一个项目文件夹,比如cpp_test,然后在根目录创建一个c++文件,我创建了一个app.cpp
写点简单的内容
#include <iostream>
using namespace std;
int main(){
cout << "hello world";
return 0;
}注意
若出现以下报错

在环境变量没有配置错误的情况下,就是vscode还没有反应过来你已经配置了环境变量
重启Vscode就行
5.1 指令运行
在终端中输入如下指令
g++ ./app.cpp -o ./app.exe会发现目录中多了一个app.exe,这是编译出来的二进制可执行文件
然后再在终端中输入如下指令,运行app.exe
./app.exe可以看到运行的结果

以上指令也可以压缩为一条,编译后就运行
g++ ./app.cpp -o ./app.exe ; ./app.exe效果一样

5.2 插件自动执行
输入指令太麻烦,还是使用插件功能得劲,以下功能来自于C/C++ Extension Pack插件
点击右上角的运行按钮,点击运行C/C++文件

然后在弹出的窗口中选择........g++.exe........,因为我们写的时c++文件,如果是c,就选第一个gcc

运行结果

并且发现项目目录下多了些东西

.vscode/tasks.json这个是选择g++编译器后生成的,主要作用是:
- 用哪个编译器(
g++/cl.exe) - 编译哪个
.cpp文件 - 输出到哪里(
-o xxx.exe) - 加哪些参数(
-g -std=c++17等)
本质上就是把你在终端手敲的 g++ main.cpp -o main.exe固化成了配置文件
通常同目录下还会有 launch.json(告诉调试器怎么启动 .exe),都属于 .vscode/工作区配置,建议保留,删了下次 F5 又要重新配置(ai说的,我觉得有道理)
xxx.exe:这个是程序编译后生成的二进制可执行文件,最后执行就是运行的这个文件,它的命名一般默认是跟cpp名字一样
6.多文件运行
我们先创建两个文件
:::code -group
#include <iostream>
using namespace std;
void helloWorld();
int main(){
helloWorld();
return 0;
}#include <iostream>
using namespace std;
void helloWorld(){
cout << "hello world1111";
}:::
可以看到,主函数在app.cpp里,并且调用了test.cpp里的helloWorld()函数
依然输入指令运行
g++ ./app.cpp -o app.exe毫无疑问会出错

然后我们使用插件来运行

卧槽,还是报错
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈操
为什么为什么为什么
因为:c嘎嘎并不会自动在项目目录中寻找其他文件的可用资源,只有你暗箱操作一番,才行
先来了解以下c++从编译到运行的大致过程

那么可以看到,cpp文件会先编译成二进制的app.o,然后再生成app.exe可执行文件
但是如果我们是多文件那么就会是这样

那么可以看到,两个cpp文件在分别编译成二进制.o文件后,需要先链接以下,再生成exe文件
想要链接多个文件,就得输入这样的指令
g++ ./app.cpp ./test.cpp -o app.exe可以看到,在./app.cpp的后面又添加了一个./test.cpp,如果还有更多的文件,就还在后面继续加
之后便可编译成功,最后看到我们的app.exe,执行便可得到结果
然后再使用我们的插件执行一下......又报错了

因为啊插件是依靠.vscode/tasks.json运行的,打开我们可以看到args于我们输入的指令貌似有点相似,那么懂js的都知道${}是字符串中使用变量,还有-o啊,.exe啊,还真是有点熟悉

${file}就是变量,你当前处于哪个文件,他就只会运行哪个文件
上面也说了c++不会在项目目录下去寻找别的文件中的资源
所以,我们要对这个.vscode/tasks.json进行一些更改
"args": [
"-fdiagnostics-color=always",
"-g",
"app.cpp",
"test.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],把${file}换成app.cpp和test.cpp这两个文件名,再执行就可以了
但是如果以后文件变得很多很多,那总不能一个一个加把
"args": [
"-fdiagnostics-color=always",
"-g",
"*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],改成这样就行,*通配符匹配所有cpp文件
6.解决乱码问题
当我们在程序中用到中文时,程序执行后中文会变成乱码
就像这样

6.1 查看编码格式
6.1.1 编译器编码格式
首先我们来看编译器中代码的编码格式
只要找到编译器右下角,看到有GBK或者UTF-8的字样,这就是编译器中代码的编码格式
很明显,此时我的代码编码格式是GBK

6.1.2 终端编码格式
在终端中输入如下指令
chcp
可以看到Active code page: 65001,那么65001就是UTF-8的字符编码编号
对应的GBK字符编码编号是936
6.2 乱码原因
乱码产生的主要原因是,终端的编码格式和编译器代码的编码格式不一样
有以下四种情况
| 代码编码方式 | 终端编码方式 | 是否统一 |
|---|---|---|
| GBK | GBK | 统一 |
| UTF-8 | UFT-8 | 统一 |
| GBK | UFT-8 | 不统一 |
| UTF-8 | GBK | 不统一 |
所以,想要程序执行不乱码,只要代码编码方式和终端编码方式统一就行
不管是统一为UTF-8还是统一为GBK
不过UTF-8是国际通用的字符编码格式,还是推荐UTF-8
GBK和UTF-8
UTF-8
- 优点:
- 国际通用支持所有语言、emoj、特殊符号,避免乱码。
- 跨平台:Linux、macOS、Web、现代编程语言默认都使用UTF-8。
- 未来兼容:Windows10/11已逐步将UTF-8设为系统默认(需开启Beta功能)。
- 无编码冲突:比如JSON、XML、HTML推荐用UTF-8,GBK可能导致解析错误。
- 缺点:主要在旧版Windows命令行时
- 少数老Windows工具(如find、sort)在代码页65001下可能行为异常。
- 某些仅支持ANSI的老程序(如用C标准/O未处理Unicode的)输出会乱码。
GBK
- 优点
- 与简体中文Windows原生ANSI完美兼容(记事本保存为ANSI就是GBK)。
- 某些老行业软件(银行、税务、政府旧系统)强制要求GBK.
- Windows命令行中老工具运行最稳定。
- 缺点
- 不是国际标准,其他系统默认不识别
- 无法表示生僻字、emoji、多语言混合文本。
- 跨平台传输(比如代码上传到Git)容易变成乱码。
6.3 统一编码格式
6.3.1 修改编译器编码格式
点击编译器右下角的编码格式
会在上面弹出一个框,选择通过编码重新打开

之后在新弹出的窗口找到你想统一的编码格式,如UTF-8

这样就改好了

6.3.2 修改终端编码格式
修改终端编码格式需要在电脑的设置里修改
打开电脑设置,win+i快捷键可直接打开
点击时间和语言→语言和区域

往下滑找到管理语言设置打开

点击更改系统区域设置
勾选Beta版:....UniCode UTf-8......
然后确定
确定之后,会让你系统重启,重启之后就可以了

之后再执行,就不会乱码了

