摘要:本文介绍了 MSYS2 项目、Cygwin 与 MinGW 的区别、以及二者名称由来,旨在给用户提供一个清晰的介绍,帮助用户理解其区别和做出技术选型,以及节省时间。
在 Windows 上写 C++:MSYS2、MinGW 与 Cygwin 到底怎么选?
作者:Qwen
日期:2025 年 12 月 25 日
如果你是在 Windows 上用 GCC 编译 C++ 程序的开发者,很可能你已经接触过 MSYS2 、MinGW 或 Cygwin。但它们到底是什么?有什么区别?为什么有的程序需要带 DLL,有的却能直接运行?本文将从三个核心角度为你厘清这些常被混淆的概念:
- MSYS2 是什么?
- Cygwin 和 MinGW 的本质区别
- 名字背后的秘密:顾名思义理解技术
一、MSYS2:Windows 上的现代化 GNU 开发平台
MSYS2(Minimal SYStem 2) 并不是一个编译器,而是一个完整的开发环境生态系统 。它基于 Arch Linux 的包管理器 pacman,整合了 MinGW-w64 工具链,目标是:
在 Windows 上提供类 Unix 的开发体验,同时能构建真正的原生 Windows 程序。
三大子系统
MSYS2 实际上包含三种运行时环境:
| 环境 | 路径前缀 | 用途 |
|---|---|---|
| MSYS2 | /usr |
运行 shell 工具(bash、make、autoconf 等),依赖 msys-2.0.dll |
| MinGW-w64 (32位) | /mingw32 |
编译 32 位原生 Windows 程序 |
| MinGW-w64 (64位) | /mingw64 |
编译 64 位原生 Windows 程序 ✅(主流选择) |
当你使用类似 C:\msys64\mingw64\bin\g++.exe 的路径时,你正在使用 MinGW-w64 工具链 ------它生成的 .exe 文件不依赖 MSYS2 运行时,可以直接分发给用户。
强大的包管理
通过 pacman,你可以一键安装数千个预编译库:
bash
pacman -S mingw-w64-x86_64-gcc # 安装 GCC
pacman -S mingw-w64-x86_64-cmake # 安装 CMake
pacman -S mingw-w64-x86_64-boost # 安装 Boost
这使得 MSYS2 成为 FFmpeg、VLC、Git for Windows 等知名开源项目的官方构建平台。
二、Cygwin vs MinGW:根本区别在哪?
很多初学者会混淆 Cygwin 和 MinGW,因为它们都"在 Windows 上跑 GCC"。但它们的设计哲学截然不同。
核心一句话总结:
- Cygwin:让 Windows 像 Linux(需运行时)
- MinGW:用 Linux 工具造 Windows 程序(无依赖)
对比维度
| 特性 | Cygwin | MinGW / MinGW-w64 |
|---|---|---|
| 目标 | 提供 POSIX 兼容层 | 直接编译原生 Windows 程序 |
| 依赖 DLL | 必须带 cygwin1.dll |
通常无依赖(可静态链接) |
| API 调用 | POSIX(如 fork(), pthread) |
Win32 API(或通过 winpthreads 模拟 pthread) |
| 程序性质 | 需运行时支持的"伪原生"程序 | 真·原生 PE 可执行文件 |
| 性能 | 略低(系统调用需转换) | 高(直接调用 Windows 内核) |
| 适用场景 | 移植 Unix 工具(如 rsync、bash) | 开发 Windows 应用、游戏、DLL 插件 |
💡 举个例子:用 Cygwin 编译的
hello.exe如果拷到另一台没装 Cygwin 的电脑上,会报错"找不到 cygwin1.dll";而用 MinGW-w64 编译的同样程序,双击就能运行。
为什么 MinGW-w64 更受现代项目青睐?
- 无需额外运行时,便于分发
- 与 Windows SDK、COM、DirectX 无缝集成
- 支持最新 C++ 标准(GCC 14+)
- MSYS2 提供了完善的包管理和更新机制
三、名字的由来:顾名思义理解技术
技术命名往往藏着设计初衷。我们来看看这两个名字的"字面意思"。
🔹 Cygwin = Cygnus + Windows
- Cygnus Solutions 是一家 1990 年代的公司,专注于 GCC 和 GNU 工具链的商业支持。
- 1995 年,他们启动了一个项目:让 Unix 软件能在 Windows 上运行 ,于是有了 Cygwin。
- 有趣的是,"cyg" 也让人联想到 cygnet(小天鹅) ------ Cygwin 的 logo 正是一只优雅的天鹅。
所以,Cygwin 本质上是 "Cygnus 为 Windows 打造的 POSIX 兼容层"。
🔹 MinGW = Minimalist GNU for Windows
- Minimalist(极简主义):强调"不做多余的事",不模拟 POSIX,只提供编译 Windows 程序所需的最小 GNU 工具集。
- GNU:指 GCC、binutils、GDB 等自由软件工具链。
- for Windows:目标明确------服务 Windows 平台。
因此,MinGW 的哲学是:"用 Linux 的工具,造 Windows 的程序"。
后来,社区在 MinGW 基础上发展出 MinGW-w64(注意不是"MinGW 64"),增加了 64 位支持、Unicode、更多 Win32 API 覆盖等,成为今日主流。
结语:如何选择?
-
✅ 想开发可分发的 Windows 应用(C++/C/Fortran)?
→ 用 MSYS2 + MinGW-w64(推荐)
-
✅ 需要
fork()、select()等 Unix 特有功能?→ 考虑 Cygwin ,但更建议使用 WSL2(现代替代方案)
-
✅ 只是想要 bash、grep、sed 等命令行工具?
→ MSYS2 的 MSYS 环境或 Git Bash 已足够
如今,MSYS2 + MinGW-w64 已成为 Windows 上开源 C/C++ 开发的事实标准。它既保留了 GNU 工具链的灵活性,又输出真正原生的 Windows 程序------这正是它广受 FFmpeg、Qt、Python 官方等项目信赖的原因。
希望这篇文章帮你彻底理清了这些"看起来很像"的工具。下次再看到 g++.exe,你就知道它背后站着的是谁了!
延伸阅读:
分享一个命令,快速在 powershell 上进入。