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
等待安装完成即可。
以上命令默认会执行静默安装(安装过程中的自定义选项会自动应用默认值),如果你想要自定义安装选项,可以使用以下命令以执行交互式安装。
winget install MSYS2.MSYS2 --interactive
如果你的 Windows 版本不支持 WinGet,或者你不想通过 WinGet 安装,请使用下面的方式。
方式二:通过安装包安装
你可以进入 MSYS2 官网 自行下载安装包并安装,也可以参考下面的步骤。
1、进入 MSYS2 官网:
根据自己的平台情况选择相应的下载按钮并点击它以下载安装包,然后等待下载完成。
2、运行安装包:
首先映入眼帘的是欢迎界面,直接点【Next】以开始安装流程:
之后进入安装路径选择界面。
3、指定安装路径,然后点击【Next】:
安装路径建议保持默认。如果需要修改,也请注意,路径中不要包含中文、空格等非 ASCLL 字符,这一点一直是软件开发领域的共识。如果修改了安装路径,请暂时记住它,因为一会需要用到这个路径。
然后进入开始菜单文件夹选择界面。
4、指定开始菜单文件夹,然后点击【Next】:
这一步通常都没有修改的必要,它和 MSYS2 的安装位置没有任何关系,只是相关的快捷方式被放在哪而已。
然后就正式开始安装了:
不出意外的话,一会儿之后就安装完成了:
此界面中,【Run MSYS now.】(安装过程结束后立即运行 MSYS2)根据自己情况进行选择即可,然后点击【Finish】以结束安装流程。
【第二步】安装 MinGW-w64
1、打开 MSYS2。
首次打开 MSYS2,我们先输入以下命令,以同步软件包数据库并升级所有软件包(这是包管理器常规操作):
pacman -Syu
以上命令执行过程中,出现任何询问直接回车(回车与输入 y 是等效的)即可,有可能需要重启 MSYS2 才能完成更新,重新启动后再执行一遍,确保更新完成(如果不确定就多跑几遍,直到结果出现“there is nothing to do”,如下图)。
2、安装 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
然后等待命令执行完成即可。
【第三步】配置环境变量(可选)
安装完就可以使用了,MSYS2 提供了几种开箱即用的 Shell 环境:
它们分别针对不同的 C/C++ 标准库、编译器工具链以及目标架构。比如,如果你刚才安装的是 ucrt64,那么在 MSYS2 UCRT64 环境中,gcc 等命令是直接可用的,相当于直接附带了对应工具链的 Path。
总之,使用 MSYS2 的 Shell 环境,就不需要配置环境变量。但如果你想要在其他 Shell 中使用,那么就需要针对 Windows 系统配置环境变量了,如果你熟悉,可以自行配置,或者可以参考下面的步骤。
1、找到 MinGW-w64 的安装路径
在配置环境变量前,我们要找到 MinGW-w64 的安装路径,这取决于两个因素,你的 MSYS2 的安装路径,以及你安装了哪个工具链(如果安装了多个,那么只能同时配置一个,这个很容易理解)。
1.1、首先找到 MSYS2 的安装路径,以默认的 C:\msys64 为例,在此路径下有 3 个文件夹,分别对应之前说的 3 种工具链:
1.2、选择你所安装的工具链对应的文件夹,这里以 ucrt64 为例,该文件夹下的 bin 文件夹的路径,就是我们要添加到 Path 变量中的值:
因此,我们需要在 Path 变量中添加的路径为 C:\msys64\ucrt64\bin。
2、配置 Path 环境变量
2.1、键盘按 Win + R 打开运行窗口,输入 sysdm.cpl 回车,打开系统属性窗口:
2.2、依次点击【高级】、【环境变量】,找到【系统变量】的【Path】变量,双击它:
2.3、然后点击【新建】,粘贴刚才的路径,回车:
2.4、依次点击 3 次【确定】:
最后打开一个新的终端窗口输入 gcc --version 验证一下:
后续更新
后续如果要更新 MSYS2 和 MinGW-w64,只需要在 MSYS2 中输入以下命令:
pacman -Syu
等待命令执行完成即可。






















