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

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


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

作者:Qwen

日期:2025 年 12 月 25 日

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

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 上进入。

相关推荐
华仔啊2 小时前
都在用 Java8 或 Java17,那 Java9 到 16 呢?他们真的没用吗?
java·后端
WizLC2 小时前
【后端】面向对象编程是什么(附加几个通用小实例项目)
java·服务器·后端·python·设计语言
风象南2 小时前
SpringBoot 该不该用统一包装类
后端
muyouking112 小时前
Rust Nightly 切换指南:解锁前沿特性的钥匙
开发语言·后端·rust
没有bug.的程序员2 小时前
Ribbon vs LoadBalancer 深度解析
jvm·后端·spring cloud·微服务·ribbon·架构·gc调优
CryptoRzz2 小时前
墨西哥股票数据 API 对接实战指南(含实时行情与 IPO 功能)
java·后端·websocket·区块链
IT_陈寒2 小时前
SpringBoot 3.0实战:5个高频踩坑点及性能优化方案,让你的应用吞吐量提升40%
前端·人工智能·后端
大学生资源网2 小时前
基于springboot的南京特色美食小吃商城(源码+文档)
java·spring boot·后端·mysql·毕业设计·源码
superman超哥3 小时前
仓颉Union类型的定义与应用深度解析
开发语言·后端·python·c#·仓颉