windows上写C++的编译器选择和环境

346 阅读6分钟

摘要:本文介绍了 MSYS2 项目、Cygwin 与 MinGW 的区别、以及二者名称由来,旨在给用户提供一个清晰的介绍,帮助用户理解其区别和做出技术选型,以及节省时间。


在 Windows 上写 C++:MSYS2、MinGW 与 Cygwin 到底怎么选?

如果你是在 Windows 上用 GCC 编译 C++ 程序的开发者,很可能你已经接触过 MSYS2MinGWCygwin。但它们到底是什么?有什么区别?为什么有的程序需要带 DLL,有的却能直接运行?本文将从三个核心角度为你厘清这些常被混淆的概念:

  1. MSYS2 是什么?
  2. Cygwin 和 MinGW 的本质区别
  3. 名字背后的秘密:顾名思义理解技术

一、MSYS2:Windows 上的现代化 GNU 开发平台

🧬 名字的由来与技术演进

MSYS2 的名字是 Minimal SYStem 2 的缩写。

这个名字清晰地表达了它的定位和版本迭代:

  • Minimal SYStem (MSYS):意为“最小系统”。这表明它的设计初衷是提供一个精简的、用于辅助开发的类 Unix 环境,而不是一个庞大而全面的模拟层。
  • 2:代表它是第二代,是初代 MSYS 项目的重大升级和改进版本。

MSYS2 的名称背后其实隐藏着一段技术演进史,它与 Cygwin 和 MinGW 这两个项目密切相关。

  1. Cygwin (POSIX 兼容层) 最初,为了让 Windows 能运行类 Unix 的程序,诞生了 Cygwin。它通过一个名为 cygwin1.dll 的兼容层,将 POSIX 系统调用“翻译”成 Windows API。这种方式功能强大,但相对臃肿,且编译出的程序必须依赖这个 DLL。

  2. MSYS (MinGW 的辅助工具) MinGW (Minimalist GNU for Windows) 的目标是直接编译出原生的 Windows 程序,无需额外依赖。但为了在 Windows 上方便地使用 bashmake 等 Unix 风格的构建工具,开发者从当时较旧的 Cygwin 版本中分叉出了一个精简版,这就是第一代 MSYS。它只保留了必要的 POSIX 功能,体积小巧,专门用来辅助 MinGW 进行开发。

  3. MSYS2 (现代化的开发平台) 随着时间推移,第一代的 MSYS 和 MinGW 更新缓慢。于是,社区基于新版 Cygwin 重新创建了 MSYS 项目,并引入了 Arch Linux 上广受欢迎的 pacman 包管理器,同时集成了更强大的 MinGW-w64 工具链。这个全新的、功能更强大的平台就是 MSYS2

因此,MSYS2 的名字不仅代表了“最小系统第二代”,更体现了它在继承 MSYS 精简理念的同时,通过整合现代技术(pacman 和 MinGW-w64),发展成为一个功能完备的现代化 Windows 开发平台。

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,你可以一键安装数千个预编译库:

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 程序(无依赖)

对比维度

特性CygwinMinGW / MinGW-w64
目标提供 POSIX 兼容层直接编译原生 Windows 程序
依赖 DLL必须带 cygwin1.dll通常无依赖(可静态链接)
API 调用POSIX(如 fork(), pthreadWin32 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和MinGW名字的由来:顾名思义理解技术

技术命名往往藏着设计初衷。我们来看看这两个名字的“字面意思”。

🔹 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进入bash环境的命令

分享一个命令,快速在 powershell 上进入。 在 powershell的

# C:\Users\YOUR—USERNAME\Documents\WindowsPowerShell
function mingw{
    $env:PATH = "C:\usr\msys64\mingw64\bin;C:\usr\msys64\usr\bin;$env:PATH";$env:MSYSTEM = "MINGW64";
    & "C:\usr\msys64\usr\bin\bash.exe" 
}