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

36 阅读5分钟

摘要:本文介绍了 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) 并不是一个编译器,而是一个完整的开发环境生态系统。它基于 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 = 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" 
}