在 Windows 平台上搭建 C/C++ 编译环境(MSYS2 + MinGW-w64)保姆级教程
➤ 什么是 C/C++ 编译环境
➥ 编译环境与开发环境的区别
开发环境
通常我们搭建开发环境,都会直接安装 IDE,即集成开发环境。所谓集成开发环境,就是它把开发所需要的各种零碎的东西都打包好了,比如用来编辑代码的编辑器、用来把代码翻译成可执行文件的编译器、用来调试代码的调试器等。IDE 的优点是开箱即用,安装一个 IDE,立马就可以开始开发了,所以很多课程、教学最开始都会推荐新手安装 IDE;IDE 的缺点就是隐藏编译细节和捆绑。
编译环境
而编译环境,是开发环境中只负责完成编译过程的部分。
为什么要独立搭建编译环境,而不总是搭建完整的开发环境?因为:
- 我们有时候只需要编译,不需要开发,比如很多开源软件和项目,都支持下载源代码后自己编译;
- 能够更灵活地选择开发环境的各个部分;
- 能够更便捷地编译简单的项目;
➥ C/C++ 编译环境的组成
不同的编程语言,从源代码到可执行文件,需要的工具会有所不同,并且往往不止需要一个工具,比如 C/C++ 语言需要链接器。因此,我们将从源代码到可执行文件的编译过程中所需要的一系列工具,称为编译工具链,更准确些。
Linux 平台往往自带 C/C++ 的编译环境,即使没有,搭建它也非常简单,通常只需要一个命令,比如 sudo apt install gcc。这导致我们经常认为,搭建编译环境,就等于安装编译器,这种说法没错,但不严谨。重要的是我们要理解我们经常挂在嘴边的“编译器”意味着什么。
通常我们通过 sudo apt install gcc 安装的,不光是 gcc 这个我们常用的命令,还有其它命令行工具,以及标准库(标准头文件,以及实现它们的库文件等),它们构成了一个完整的编译工具链。
所以,C/C++ 编译环境,或者说 C/C++ 编译工具链,实际上可以分为
- 一系列编译用的可执行文件;
- 一系列标准库文件。
➤ Windows 平台上有哪些主流 C/C++ 编译环境
这里我们只考虑最终生成的是 Windows 可执行程序的编译环境(排除 WSL、虚拟机、兼容层等):
- MSVC(Microsoft Visual C++),Windows 平台原生编译工具链,对 Windows 平台兼容性最好,开发原生 Windows 程序的首选,Visual Studio 深度集成;
- MinGW-w64(Minimalist GNU for Windows 64-bit),GCC 工具链的移植,因为是移植所以没有官方提供统一安装包,所有编译好可直接安装的版本,几乎都是第三方项目,作为子工具,以工具包的形式发布,这也就导致了各种工具包所包含的工具不统一;
- Clang,Clang 是和 GCC 不相上下的一款 C/C++ 编译工具链,并且它有一个优点,就是官方提供编译、打包好的安装包,不过包含内容太过全面,很多内容已经超出编译环境的范畴,比如代码格式化工具等;
➥ 为什么选择 MinGW-w64
就因为它是 GCC 的移植。GCC 是对 C/C++ 标准支持最好的编译器,我们可以简单看一张图:

另外使用 MinGW-w64 还有以下优点:
- 类似在 Linux 上的使用体验;
- 对命令行编译友好;
- 对跨平台开发支持最好。
➥ 安装 MinGW-w64 的方法有哪些
之前也说过,MinGW-w64 没有官方提供统一安装包,所以就导致了安装它的方法有很多,有以下这些工具包包含 MinGW-w64(数据来源于 MinGW-w64 官网):
- Cygwin,通过兼容层模拟 Unix 环境,让 Unix 软件在 Windows 上运行,它生成的不是原生的 Windows 程序,所以排除;
- LLVM-MinGW,并不是 GCC + MinGW-w64,而是 Clang + MinGW-w64,所以排除;
- MinGW-W64-builds,提供完整的 GCC 工具链,由个人开发者维护;
- MSYS2,提供类 Unix 命令行环境,但通过它安装的 MinGW-w64 可以生成原生的 Windows 程序;
- w64devkit,极简、便捷的 GCC 工具链;
- WinLibs,同时支持 GCC 和 Clang。
严格意义上来说,MinGW-w64 与 GCC 没有直接关系,通常我们认为的,以及本文大部分情况所说的 MinGW-w64 是完整的 GCC 工具链,这是由于 MinGW-w64 的前身 MinGW 提供完整的 GCC 工具链,而 MinGW-w64 只包含前文所述编译工具链的标准库部分。下图是官网的介绍:

➥ 为什么选择 MSYS2
在众多的工具包中,我们选择 MSYS2。MSYS2 相较于其它并不是最便捷的,并且它本身并不是我们要安装的工具链,而是一个模拟 Unix 环境的命令行工具。那么为什么选择 MSYS2 呢?
- 能够保证工具链版本是最新的,MSYS2 移植了著名 Linux 发行版 Arch Linux 上的包管理器 Pacman,而 Pacman 采用滚动更新机制;
- 我们在需要时能够按需添加其它工具,MSYS2 项目提供了一个包管理器,并且 MSYS2 项目还维护了很多工具(比如我们要安装的工具链的命令行工具部分是由 MSYS2 项目维护的);
- 安装和更新方便,由于其使用包管理器,所以安装和更新工具包往往只需要一行命令;
- 提供类 Unix 环境,使得我们能获得更贴近 Unix 环境的使用体验。
➀ 下载安装 MSYS2
方式一:通过 WinGet 安装(推荐)
这种方法适用于支持 WinGet 的 Windows 版本,通常是 Windows 10 及以上。
打开终端,输入以下命令:
winget install MSYS2.MSYS2
等待安装完成即可。
方式二:通过安装包安装
- 打开 MSYS2 官网【https://www.msys2.org/】,找到下载按钮,根据自己情况选择:

- 下载完成后,打开安装包,欢迎界面,点【Next】:

- 选择安装路径界面,建议保持默认,如果要修改也最好保证安装路径不要有中文和空格,然后点击【Next】:

- 选择开始菜单文件夹界面,保持默认,然后点击【Next】:

- 等待安装:

- 安装完成,【Run MSYS now.】(安装过程结束后立即运行 MSYS2)可勾可不勾,然后点击【Finish】:

➁ 安装 MinGW-w64
- 打开 MSYS2,先输入以下命令,同步软件包数据库并升级所有软件包:
pacman -Syu
中途出现任何询问直接回车即可,有可能需要重启才能完成更新,重新启动后再执行一遍,确保更新完成(如果不确定就多跑几遍,直到结果出现“there is nothing to do”,如下图)。

- 安装 MinGW-w64:
MSYS2 提供了 3 种使用 GCC 的 MinGW-w64 工具链,分别是:
| 工具链 | 包名 |
|---|---|
| mingw32 | mingw-w64-i686-gcc |
| mingw64 | mingw-w64-x86_64-gcc |
| ucrt64 | mingw-w64-ucrt-x86_64-gcc |
三者区别在于生成的 Windows 程序的架构不同,以及使用的 C 运行时库不同:
- mingw32 用于生成 32 位 Windows 应用程序,其它两个生成的都是 64 位;
- ucrt64 使用了较新的 C 运行时库,其它两个使用了较老的 C 运行时库。
目前最推荐使用的是 ucrt64,这里就以它为例,当然如果你有特殊需求也可以安装别的,并且可以同时安装多个。在 MSYS2 中输入以下命令安装:
pacman -S mingw-w64-ucrt-x86_64-gcc
等待命令执行完成即可。
➂ 配置环境变量
安装成功后,还不能直接使用,还需要配置 Path 环境变量。
配置 Windows 环境变量
找到 MinGW-w64 的安装路径
在配置环境变量前,我们要找到 MinGW-w64 的安装路径,这取决于两个因素,你的 MSYS2 的安装路径,以及你安装了哪个工具链(如果安装了多个,那么只能同时配置一个,这个很容易理解)。
- 首先找到 MSYS2 的安装路径,以默认的
C:\msys64为例,在此路径下有 3 个文件夹,分别对应之前说的 3 种工具链:

- 选择你所安装的工具链对应的文件夹,这里以
ucrt64为例,该文件夹下的bin文件夹的路径,就是我们要添加到 Path 变量中的值:

因此,我们需要在 Path 变量中添加的路径为 C:\msys64\ucrt64\bin。
配置 Path 环境变量
- 键盘按【Win + R】打开运行窗口,输入
sysdm.cpl回车,打开系统属性窗口:

- 依次点击【高级】、【环境变量】,找到【系统变量】的【Path】变量,双击它:



- 然后点击【新建】,粘贴刚才的路径,回车:


- 依次点击 3 次【确定】:



最后打开一个新的终端窗口输入 gcc --version 验证一下:

➤ 后续更新
后续如果要更新 MSYS2 和 MinGW-w64,只需要在 MSYS2 中输入以下命令:
pacman -Syu
等待命令执行完成即可。