Windows 环境搭建:MinGW-w64、Cygwin 与 WSL 2

Windows 上做编译,说白了就三条路。我这些年三条路都走过,踩过的坑能写满一页纸。今天咱们一条一条捋清楚,你照着做就行。

一、MinGW-w64:轻量级原生编译

MinGW-w64 是 Windows 上的原生 GCC 移植版。它编译出来的 .exe 直接跑,不需要额外运行时。适合做 Windows 本地开发,比如写 Win32 API 或者跨平台库的 Windows 版。

1. 下载与安装

别去官网一个个点,太慢。我推荐用 MSYS2 来管理 MinGW-w64。

  1. 去 msys2.org 下载安装包,装到 C:\msys64(路径别带空格)
  2. 打开 MSYS2 UCRT64 终端,跑更新:
pacman -Syu

如果提示要关闭终端,关掉重开,再跑一次:

pacman -Su
  1. 安装 MinGW-w64 工具链:
pacman -S mingw-w64-ucrt-x86_64-toolchain
我的习惯:装完立刻检查版本。跑 gcc --version 和 g++ --version,确认输出是 x86_64-w64-mingw32 而不是 i686。32位工具链在 2024 年基本可以扔了。

2. 环境变量配置

把 C:\msys64\ucrt64\bin 加到系统 PATH 里。注意顺序——放在 C:\Windows\System32 前面,避免被系统自带的旧版工具覆盖。

我曾经踩过的坑:装了 MinGW-w64 后,系统里还有另一个 Git Bash 带的 MinGW。两个 gcc.exe 冲突,编译出来的东西链接阶段报错。解决方案:只留一个,或者用绝对路径调用。

3. 验证编译

gcc -o hello hello.c
./hello.exe

能跑出 "Hello World" 就算成了。如果报 libwinpthread-1.dll 找不到,把 C:\msys64\ucrt64\bin 里的 dll 拷到 exe 同目录,或者静态链接:

gcc -static -o hello hello.c

二、Cygwin:POSIX 兼容层

Cygwin 不是原生编译。它提供一个 POSIX 模拟层,让你在 Windows 上跑 Linux 程序。说白了,它把 Linux 系统调用翻译成 Windows API。

什么时候用 Cygwin?你手头有个 Linux 项目,不想改代码,又必须在 Windows 上跑。我当年移植过一个网络工具,Cygwin 下直接编译通过,省了至少两周的移植时间。

1. 安装要点

  1. 从 cygwin.com 下载 setup-x86_64.exe
  2. 安装时选 Install from Internet
  3. Root Directory 建议用 C:\cygwin64
  4. Local Package Directory 随便,用完可以删

2. 必装包列表

包名 说明 我为什么推荐
gcc-core / gcc-g++ C/C++ 编译器 核心工具,必装
make 构建工具 没有它你没法编译复杂项目
cmake 跨平台构建系统 现代项目标配
libiconv-devel 字符编码转换 处理中文路径时救命用的
cygrunsrv 将 Cygwin 程序注册为 Windows 服务 生产环境部署时很有用
性能对比:Cygwin 编译速度比原生 MinGW-w64 慢 20%-30%,因为每次系统调用都要经过模拟层。如果你追求性能,优先考虑 WSL 2。

3. 避坑指南

  • 路径问题:Cygwin 里 /cygdrive/c/Users 对应 Windows 的 C:\Users。别直接用 Windows 路径,否则编译脚本会炸。
  • 换行符:Cygwin 默认用 LF,Windows 用 CRLF。git 配置 core.autocrlf input 可以避免。
  • DLL 依赖:编译出来的 exe 依赖 cygwin1.dll。分发时记得带上,或者用 -mno-cygwin 编译(但新版 Cygwin 已移除这个选项)。

三、WSL 2:真正的 Linux 内核

WSL 2 是微软在 Windows 上跑的一个完整 Linux 内核。它用 Hyper-V 虚拟化技术,但启动速度比传统虚拟机快得多。说白了,你在 Windows 上开了一个 Linux 子系统,能直接跑 Ubuntu、Debian 等发行版。

我个人现在主力用 WSL 2。为什么?因为它和 Windows 的集成度最高——文件互通、网络共享、甚至能用 VS Code 直接连 WSL 里的编译器。

1. 启用 WSL 2

以管理员身份打开 PowerShell,跑:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重启电脑后,设置 WSL 2 为默认版本:

wsl --set-default-version 2
注意:如果报错说需要 Virtual Machine Platform,去 BIOS 里开启虚拟化(Intel VT-x / AMD SVM)。我遇到过一台联想笔记本,BIOS 里虚拟化默认是关的,折腾了我半小时。

2. 安装 Linux 发行版

从 Microsoft Store 搜索 "Ubuntu" 安装。或者用命令行:

wsl --install -d Ubuntu-22.04

装完第一次启动,设置用户名和密码。然后更新包管理器:

sudo apt update && sudo apt upgrade -y

3. 安装编译工具链

sudo apt install build-essential cmake gdb valgrind -y

验证:

gcc --version
cmake --version

4. 与 Windows 的互操作

WSL 2 把 Windows 的 C:\ 挂载在 /mnt/c/。你可以直接在 WSL 里访问 Windows 文件:

cd /mnt/c/Users/你的用户名/projects
gcc -o hello hello.c

反过来,Windows 也能访问 WSL 的文件系统。在资源管理器地址栏输入 \\wsl$\Ubuntu-22.04\home\你的用户名,就能看到 Linux 里的文件。

效率技巧:把项目文件放在 WSL 的文件系统里(比如 /home/你的用户名/projects),而不是放在 /mnt/c/ 下。因为跨文件系统访问有性能损耗,编译大项目时能差出 2-3 倍的速度。

四、三种方案对比

特性 MinGW-w64 Cygwin WSL 2
编译产物 原生 Windows exe 依赖 cygwin1.dll Linux ELF 二进制
POSIX 兼容性 低(只有基本 API) 高(完整模拟层) 完全(真实内核)
性能 高(原生) 中(有模拟开销) 高(接近原生 Linux)
启动速度 即时 即时 1-2 秒
适用场景 Windows 本地开发 移植 Linux 项目 Linux 开发/服务器部署

五、知识体系总览

下面这张图帮你理清三种方案的关系和选择逻辑:

Windows 编译环境搭建方案对比 Windows 编译环境搭建方案 Windows 编译环境 MinGW-w64 Cygwin WSL 2 特性 • 原生 Windows exe • 无额外依赖 • 编译速度快 • POSIX 支持有限 特性 • POSIX 模拟层 • 依赖 cygwin1.dll • 移植 Linux 项目 • 性能中等 特性 • 完整 Linux 内核 • 原生性能 • 与 Windows 集成好 • 启动 1-2 秒 选择建议 • 做 Windows 本地开发 → MinGW-w64 • 移植 Linux 项目到 Windows → Cygwin • 做 Linux 开发/服务器部署 → WSL 2

六、我的最终建议

如果你刚开始学编译,我建议直接上 WSL 2 + Ubuntu。为什么?因为绝大多数开源项目、教程、社区支持都是面向 Linux 的。你在 WSL 里遇到的问题,Google 一搜就有答案。MinGW-w64 和 Cygwin 的问题,有时候得翻半天论坛。

但如果你做的是 Windows 桌面应用开发,比如用 Qt 写 GUI 程序,那 MinGW-w64 是更好的选择。编译出来的 exe 直接发给用户就能跑,不用教人家装 WSL。

至于 Cygwin……嗯,除非你手头有必须移植的遗留项目,否则我建议跳过它。WSL 2 在绝大多数场景下都是更好的替代品。

一句话总结:新手用 WSL 2,Windows 原生开发用 MinGW-w64,Cygwin 留给历史项目。三种方案不冲突,你可以全装上,按需切换。