Windows 环境搭建:MinGW-w64、Cygwin 与 WSL 2
Windows 上做编译,说白了就三条路。我这些年三条路都走过,踩过的坑能写满一页纸。今天咱们一条一条捋清楚,你照着做就行。
一、MinGW-w64:轻量级原生编译
MinGW-w64 是 Windows 上的原生 GCC 移植版。它编译出来的 .exe 直接跑,不需要额外运行时。适合做 Windows 本地开发,比如写 Win32 API 或者跨平台库的 Windows 版。
1. 下载与安装
别去官网一个个点,太慢。我推荐用 MSYS2 来管理 MinGW-w64。
- 去 msys2.org 下载安装包,装到
C:\msys64(路径别带空格) - 打开 MSYS2 UCRT64 终端,跑更新:
pacman -Syu
如果提示要关闭终端,关掉重开,再跑一次:
pacman -Su
- 安装 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 前面,避免被系统自带的旧版工具覆盖。
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. 安装要点
- 从 cygwin.com 下载 setup-x86_64.exe
- 安装时选 Install from Internet
- Root Directory 建议用
C:\cygwin64 - Local Package Directory 随便,用完可以删
2. 必装包列表
| 包名 | 说明 | 我为什么推荐 |
|---|---|---|
| gcc-core / gcc-g++ | C/C++ 编译器 | 核心工具,必装 |
| make | 构建工具 | 没有它你没法编译复杂项目 |
| cmake | 跨平台构建系统 | 现代项目标配 |
| libiconv-devel | 字符编码转换 | 处理中文路径时救命用的 |
| cygrunsrv | 将 Cygwin 程序注册为 Windows 服务 | 生产环境部署时很有用 |
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
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 里的文件。
/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 开发/服务器部署 |
五、知识体系总览
下面这张图帮你理清三种方案的关系和选择逻辑:
六、我的最终建议
如果你刚开始学编译,我建议直接上 WSL 2 + Ubuntu。为什么?因为绝大多数开源项目、教程、社区支持都是面向 Linux 的。你在 WSL 里遇到的问题,Google 一搜就有答案。MinGW-w64 和 Cygwin 的问题,有时候得翻半天论坛。
但如果你做的是 Windows 桌面应用开发,比如用 Qt 写 GUI 程序,那 MinGW-w64 是更好的选择。编译出来的 exe 直接发给用户就能跑,不用教人家装 WSL。
至于 Cygwin……嗯,除非你手头有必须移植的遗留项目,否则我建议跳过它。WSL 2 在绝大多数场景下都是更好的替代品。