核心结论:一句话总结
原始的 MinGW (mingw.org) 已经死亡(停止维护多年),仅支持 32 位且 GCC 版本极老。
MinGW-w64 是唯一的现代标准,支持 64 位、最新 C++ 标准、最新 Windows API,是目前 Windows 下 GCC 开发的唯一推荐选择。
如果你现在要下载,请认准MinGW-w64,绝对不要再去mingw.org下载那个过时的安装包。
1. 历史渊源:为什么会有两个名字?
理解它们的区别,首先要回顾历史。
1.1 MinGW (原始版)
- 全称: Minimalist GNU for Windows
- 诞生: 1998 年。
- 目标: 将 GCC (GNU Compiler Collection) 移植到 Windows,生成原生的 Windows 可执行文件(.exe),不需要像 Cygwin 那样依赖庞大的 POSIX 模拟层 DLL。
- 困境: 随着时间推移,原始项目的维护团队对于添加64 位支持和新 Windows API 支持变得非常保守和缓慢。他们倾向于保持简单,拒绝了很多现代化的改进。
- 现状:已废弃。其官网
mingw.org提供的安装包中,GCC 版本通常停留在 6.3.0 (2017年) 甚至更早,完全不支持 C++17/20/23,且只能编译 32 位程序。
1.2 MinGW-w64 (现代版)
- 诞生: 2007-2008 年左右。
- 起因: 由于原始 MinGW 项目拒绝合并 64 位支持的补丁,社区开发者(如 Kai Tietz 等)决定Fork (分叉)该项目,创建一个独立的项目。
- 名字含义: "w64" 不仅仅代表 "Windows 64-bit"。它代表了一个彻底重写的努力:
- 重写了头文件 (headers),以支持完整的 Win32/Win64 API。
- 重写了运行时库 (CRT),以支持 64 位架构。
- 引入了新的工具链配置。
- 现状:活跃维护中。它是目前所有现代 Windows GCC 发行版(如 MSYS2, WinLibs, LLVM-MinGW, Chocolatey/Scoop 包)的核心底层。它紧跟 GCC 主线版本,支持最新的语言特性和硬件架构。
2. 深度技术对比表
| 特性维度 | MinGW (原始版 / mingw.org) | MinGW-w64 (现代标准) | 影响与解读 |
|---|---|---|---|
| 维护状态 | ❌停止维护(Last update: ~2013-2015) | ✅活跃维护(跟随 GCC 最新版本) | 原始版有未修复的 Bug 和安全漏洞;新版持续优化。 |
| 架构支持 | ❌仅 32-bit (x86) | ✅32-bit (x86) + 64-bit (x64) + ARM64 | 原始版无法利用 4GB 以上内存,无法发挥现代 CPU 性能。 |
| GCC 版本 | 老旧 (通常 ≤ GCC 6.3) | 最新(GCC 13, 14, 15+ in 2026) | 决定了你能否使用 C++17/20/23/26 新特性。 |
| C++ 标准 | 仅支持到 C++11 (部分) | 完整支持 C++17 / C++20 / C++23 / C++26 | 现代 C++ 开发必须依赖 MinGW-w64。 |
| Windows API | 仅包含 XP/Win7 时代 API | 包含 Win10/11/Server 2022+ 最新 API | 新版能调用最新的系统函数、安全特性、DirectX 版本。 |
| 线程模型 | 仅win32(非标准模拟) | 支持win32和posix(通过winpthreads) | posix模型允许运行依赖 pthread 的 Linux 代码。 |
| 异常处理 (64位) | N/A (不支持 64 位) | SEH(Structured Exception Handling) | SEH 是 Windows 原生机制,零开销,无需额外 DLL。 |
| 长整数支持 | long long支持不完善 | 完美支持long long,__int128(部分) | 涉及大数运算、高精度时间戳时至关重要。 |
| 官方网址 | mingw.org(经常失效/误导) | mingw-w64.org/ GitHub | 千万不要去 mingw.org 下载! |
3. 核心技术差异详解
3.1 64 位架构与寄存器调用约定
这是最致命的区别。
- MinGW (原始): 根本不存在 64 位编译器。你只能生成 32 位 exe,运行在 WoW64 子系统下,效率打折,内存受限。
- MinGW-w64: 实现了完整的 x64 调用约定(Call Convention)。
- 在 x64 Windows 上,前 4 个整数/指针参数通过寄存器 (
RCX, RDX, R8, R9) 传递,而不是压栈。MinGW-w64 完美遵循这一规则,生成的代码效率与 MSVC 相当。 - 支持SEH (Structured Exception Handling):这是 Windows 64 位原生的异常处理机制。MinGW-w64 使用
.xdata和.pdata段来描述异常展开信息,不需要像旧的 SJLJ (Setjmp/Longjmp) 模式那样在每个函数中插入额外的运行时检查代码。这意味着:零运行时开销且不需要分发libgcc_s_sjlj-1.dll。
- 在 x64 Windows 上,前 4 个整数/指针参数通过寄存器 (
3.2 线程模型:win32vsposix
在下载 MinGW-w64 时(例如在 WinLibs 或 MSYS2 中),你通常会看到两种构建版本:
-win32线程模型:- 使用 Windows 原生 API (
CreateThread, etc.) 模拟 C++11std::thread。 - 优点: 不需要额外的 DLL (
winpthread-1.dll)。 - 缺点: 不支持完整的 POSIX 线程语义。某些依赖
pthread_cancel,pthread_cond_timedwait等高级特性的开源库可能无法编译或运行异常。
- 使用 Windows 原生 API (
-posix线程模型(推荐):- 链接
winpthreads库(一个基于 Windows API 实现的 pthread 库)。 - 优点: 高度兼容 Linux/Unix 代码。如果你想编译 FFmpeg, Redis, 或其他大量使用 pthread 的开源项目,必须选这个。
- 缺点: 默认动态链接需要分发
winpthread-1.dll(可以通过-static-libwinpthread静态链接解决)。 - 注意: 原始 MinGW 只有类似
win32的粗糙实现,缺乏posix的完整性。
- 链接
3.3 头文件与 Windows SDK 兼容性
- MinGW (原始): 头文件 (
windows.h, 等) 多年未更新。如果你尝试调用 Windows 10/11 引入的新 API(例如新的安全函数GetCurrentPackageInfo,或新的 DirectX 接口),编译器会报错说“未声明的标识符”。你需要手动 hack 头文件,极其痛苦。 - MinGW-w64: 拥有独立的
mingw-w64-crt项目,社区会迅速跟进微软发布的最新 SDK。- 它定义了最新的结构体、常量、GUIDs。
- 支持Unicode和ANSI的最新规范。
- 对于 C++20 的
std::filesystem,MinGW-w64 提供了基于最新 WinAPI 的实现,而旧版 MinGW 可能完全缺失此功能或实现有 Bug。
3.4 C++ 标准库 (libstdc++)
两者都使用 GNU 的libstdc++,但版本天差地别。
- 旧版 MinGW: 捆绑的是几年前的
libstdc++-6.dll。缺少std::optional,std::variant,std::filesystem,std::span,std::format等现代特性。 - MinGW-w64: 捆绑最新的
libstdc++。- 支持C++20 Modules(在较新版本 GCC 中)。
- 支持Coroutines(协程)。
- 支持Ranges(范围库)。
- 对
std::vector,std::string的性能优化也远优于旧版。
4. 如何获取正确的 MinGW-w64?(避坑指南)
既然原始 MinGW 已死,我们该如何获取 MinGW-w64?不要直接去搜 "MinGW download",因为搜索引擎可能会把过时的mingw.org排在前面。
以下是 2026 年推荐的几种获取方式:
方案 A: MSYS2 (最推荐,专业开发者首选)
MSYS2 是一个软件发行版和管理系统,它提供了类 Linux 的环境和pacman包管理器。
- 优点:
- 一键安装最新版的 MinGW-w64 (
pacman -S mingw-w64-x86_64-gcc)。 - 可以轻松安装配套工具 (
make,cmake,gdb,git)。 - 可以方便地切换 GCC 版本。
- 社区庞大,问题容易解决。
- 一键安装最新版的 MinGW-w64 (
- 适用: 需要长期开发、管理复杂依赖、习惯 Linux 工作流的开发者。
- 官网:
msys2.org
方案 B: WinLibs (最简洁,独立免安装)
WinLibs 提供预编译好的 standalone 压缩包。
- 优点:
- 解压即用,无需安装脚本。
- 包含 GCC 或 Clang + MinGW-w64 + GDB。
- 提供POSIX和Win32两种线程模型的选项(建议下载POSIX + SEH版本)。
- 非常适合配合 VS Code 使用。
- 适用: 想要轻量级环境、不想安装庞大 IDE、或在 CI/CD 中快速部署的用户。
- 官网:
winlibs.com(认准这个域名)
方案 C: 包管理器 (Chocolatey / Scoop)
如果你习惯使用命令行包管理器:
- Scoop:
scoop install mingw(Scoop 默认安装的是 MinGW-w64)。 - Chocolatey:
choco install mingw(通常也是指向 w64,但需确认)。 - 优点: 易于更新,环境变量自动配置。
❌ 绝对要避免的陷阱
- 不要去
mingw.org: 那个网站提供的 "MinGW Installer" 是古董。 - 不要下载名为 "MinGW" 但没有 "w64" 标识的旧教程推荐包: 检查 GCC 版本,如果低于 8.0,直接扔掉。
- 注意文件名: 确保下载的文件名中包含
x86_64(表示 64 位) 和w64字样。
5. 常见误区 Q&A
Q1: 我安装了 MinGW-w64,为什么有时候还要装 MSYS2?
- A: MinGW-w64 只是编译器工具链(gcc, g++, ld)。MSYS2 是一个环境,它包含了 bash shell、包管理器以及 MinGW-w64。你可以只下载 MinGW-w64 的 standalone 包(如 WinLibs)而不装 MSYS2,但这意味着你没有
pacman来方便地安装其他库(如 openssl, zlib)。如果你只需要编译器,standalone 够了;如果需要生态,选 MSYS2。
Q2: MinGW-w64 生成的程序需要安装运行库吗?
- A: 默认情况下,它会动态链接
libgcc_s_seh-1.dll,libstdc++-6.dll,libwinpthread-1.dll。- 解决方法: 编译时加上
-static-libgcc -static-libstdc++ -static-libwinpthread参数,即可生成完全独立的 .exe 文件,拷贝到任何 Windows 电脑都能跑,无需安装任何环境。这是 MinGW 相比 MSVC (通常需要安装 VC++ Redist) 的一大优势。
- 解决方法: 编译时加上
Q3: 我能用 MinGW-w64 编译 Qt 程序吗?
- A: 完全可以。Qt 官方提供预编译的 MinGW-w64 版本。事实上,很多跨平台 Qt 开发者首选 MinGW-w64,因为它能保证 Windows 下的行为与 Linux/macOS (GCC/Clang) 高度一致,减少
#ifdef _MSC_VER这种宏判断。
Q4: 为什么有些教程还在教安装旧版 MinGW?
- A: 互联网是有记忆的,很多教程是 2015-2018 年写的,当时 MinGW-w64 还没那么普及,或者作者没有更新文章。请务必查看教程的发布日期和 GCC 版本号。
6. 2026 年最佳实践建议
在 2026 年,搭建 Windows C/C++ 开发环境的黄金标准如下:
- 核心编译器: 必须使用MinGW-w64(基于 GCC 14+ 或 Clang 18+)。
- 获取方式:
- 新手/VS Code 用户: 下载WinLibs(GCC + MinGW-w64, POSIX, SEH 版本),解压到
C:\mingw64,将bin加入 PATH。 - 进阶/开源贡献者: 安装MSYS2,使用
pacman管理工具链和依赖库。
- 新手/VS Code 用户: 下载WinLibs(GCC + MinGW-w64, POSIX, SEH 版本),解压到
- 编译参数推荐:
g++ -std=c++20 -O2 -Wall -Wextra -static-libgcc -static-libstdc++ -static-libwinpthread main.cpp -o app.exe-std=c++20: 启用现代 C++。-static-*: 生成单文件 exe,避免 DLL 地狱。
- IDE 配置:
- 在 VS Code 的
c_cpp_properties.json中,将compilerPath指向 MinGW-w64 的g++.exe。 - 在 CMake 中,使用
-G "MinGW Makefiles"或Ninja生成器。
- 在 VS Code 的
总结
MinGW是一个历史名词,代表了 Windows GCC 的早期探索,但已因缺乏 64 位支持和现代化更新而被淘汰。
MinGW-w64是真正的继承者和超越者,它不仅解决了 64 位问题,更在 ABI 兼容性、线程模型、API 覆盖率和语言标准支持上达到了工业级水准。
记住:在 2026 年,当你听到 "MinGW" 时,请在脑海中自动将其替换为 "MinGW-w64"。除此之外,别无选择。