4. 开发环境搭建(Windows):安装MSVC、MinGW、Cygwin、Visual Studio工具链
Windows 上做跨平台 SDK 编译,最让人头疼的就是工具链选择。我见过不少新手一上来就装了个 Visual Studio,然后发现交叉编译到 Linux 时根本没法用。说实话,选哪个工具链,得看你最终要跑在什么平台上。
这节我们就捋一遍 Windows 下主流的四个编译环境。我按自己的经验,把它们分成「官方派」「民谣派」「模拟派」和「大而全派」。你想想看,每个派系都有自己擅长的领域。
核心原则:别指望一个工具链解决所有问题。我通常会在同一台机器上同时安装 MSVC + MinGW,再备一个 Cygwin 做 POSIX 兼容测试。
4.1 MSVC(Microsoft Visual C++)
MSVC 是 Windows 上最老牌的 C++ 编译器,也是 Visual Studio 的亲生儿子。它由微软维护,对 Windows API 的适配是最完美的。
- 获取方式:要么装完整版 Visual Studio(社区版免费),要么单独下载 Build Tools for Visual Studio(轻量级,不含 IDE)。
- 编译器位置:通常在
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.xx\bin\Hostx64\x64。 - 命令行环境:得先跑
vcvarsall.bat设置环境变量,否则 cl.exe 根本找不到。
我个人习惯用 Developer Command Prompt 启动,省得手动找脚本。曾经有个项目需要纯命令行的 CI 环境,我直接下载 Build Tools,只用了 800MB 空间就搞定了,比装全家桶快很多。
注意:MSVC 默认生成的是 Windows PE 格式的可执行文件,没法在 Linux/macOS 上直接运行。如果你想交叉编译到 ARM 或 Linux,得配合 Clang 或 MinGW 使用。
4.2 MinGW(Minimalist GNU for Windows)
MinGW 是 GCC 在 Windows 上的移植版,它用 Windows 的 CRT(C Runtime)代替了 glibc,所以生成的是原生 Windows 进程,不需要额外模拟层。说白了,你用它编译出来的 .exe 可以直接发给没有装任何工具链的 Windows 用户。
| 发行版 | 维护方 | 位宽支持 | 包管理器 |
|---|---|---|---|
| MinGW-w64 | 开源社区 | 32-bit / 64-bit | (无,手动下载) |
| TDM-GCC | 个人维护 | 32-bit / 64-bit | (无,安装器可选) |
| MSYS2 | 开源社区 | 32-bit / 64-bit | pacman(强烈推荐) |
我最推荐的是 MSYS2。它用 pacman 包管理,装库非常方便,而且提供了完整的 MinGW-w64 工具链。我曾经给一个嵌入式项目编译 Windows 端的烧录工具,用 MSYS2 几分钟就装好了所有依赖,比手动下载省了 1 小时。
安装步骤(以 MSYS2 为例):
- 去官网下载
msys2-x86_64-xxxx.exe,一路默认安装。 - 启动 MSYS2 MinGW 64-bit 终端。
- 跑
pacman -Syu更新核心包,然后重启终端。 - 安装 GCC:
pacman -S mingw-w64-x86_64-gcc。 - 验证:
gcc --version看到版本号就 ok。
# 测试一个简单的 hello world
#include <stdio.h>
int main() {
printf("Hello from MinGW!\n");
return 0;
}
// 编译:gcc hello.c -o hello.exe
// 运行:./hello.exe
小技巧:如果你在 MSYS2 里用了 pacman 安装了库(比如 libcurl),代码里 #include 的时候路径会自动被编译器找到。这比手动配置 -I 和 -L 舒心多了。
4.3 Cygwin
Cygwin 跟 MinGW 走的完全是两条路。它提供了一层 POSIX 模拟层(cygwin1.dll),让你能在 Windows 上跑 Linux 的程序。说白了,你可以在 Cygwin 里编译 Linux 下的源码,但生成的可执行文件依赖那个 dll。
我为什么还要提 Cygwin?因为有些古老的 UNIX 代码(比如 autotools 老项目)在 MinGW 下根本跑不通,但在 Cygwin 里就像在 Linux 上一样丝滑。我曾经接手过一个用 GNU AutoTools 构建的 SDK,Makefile 里全是 configure 脚本,Windows 下只有 Cygwin 能顺利过。
- 安装:下载
setup-x86_64.exe,选择安装目录。 - 包选择:建议至少勾选
gcc-core、gcc-g++、make、autoconf。 - 注意:默认安装后 gcc 是 Cygwin 版本的,不要跟 MinGW 的 gcc 搞混。
警告:用 Cygwin 编译的程序,分发给用户时必须附带 cygwin1.dll。这个 dll 有 GPL 许可证的争议。我一般只在内部测试或开发环境用 Cygwin,最终发布还是会换 MinGW 或 MSVC 重新编译。
4.4 Visual Studio IDE & 工具链
Visual Studio 是一个庞然大物,但它的编译器(MSVC)和调试器(Windows Debugger)是顶级的。如果你主要做 Windows 原生开发,VS 几乎是必装。
安装时我建议只选「使用 C++ 的桌面开发」工作负载,这样可以省掉不少磁盘空间。核心组件包括:
- MSVC v143 生成工具(对应 VS 2022)
- Windows 10/11 SDK
- C++ CMake 工具(如果你用 CMake 的话)
- Windows 调试器(WinDbg)
注意:VS 自带了一个 Developer PowerShell,启动时自动加载了 vcvarsall,比手动开 cmd 方便很多。我写跨平台代码时,会开三个终端:一个 VS Developer PowerShell(编译 Windows 版),一个 MinGW 终端(编译 Windows 版 但用 GCC),一个 WSL 终端(编译 Linux 版)。这样切换起来很顺手。
4.5 四种工具链的对比与选择
| 特性 | MSVC (VS) | MinGW (MSYS2) | Cygwin | VS IDE |
|---|---|---|---|---|
| 生成的二进制依赖 | 原生 Windows | 原生 Windows | cygwin1.dll | 原生 Windows |
| POSIX 兼容性 | 差(有 __MINGW32__ 宏) | 中(部分 POSIX 函数) | 好(完整模拟) | 差 |
| 包管理器 | vcpkg / NuGet | pacman | cygwin 安装器 | NuGet / 扩展 |
| 调试能力 | 强(WinDbg, VS Debugger) | 中(GDB 较旧) | 中(GDB) | 极强(图形化调试) |
| 交叉编译 Linux | 需 Clang 或 cross-GCC | 可用 mingw-w64-cross | 不支持 | 需安装 Linux 工具集 |
你可能会问:这四种我到底该装哪些?我的建议是这样的:
- 如果你是 Windows 原生开发者,Visual Studio + MSVC 是主菜。
- 如果你要编译跨平台开源库(比如 FFmpeg、OpenSSL),MSYS2 + MinGW-w64 是最省心的。
- 如果你要运行 Linux 的自动化构建脚本(configure/make),Cygwin 或 WSL 可以救急。
- 如果你是做纯粹的命令行交叉编译,Build Tools for VS 就够了,不用碰 IDE。
嗯,说了这么多,我画了一张图帮你理清思路。这是一个简单的决策流程,你看看自己属于哪条路。
最后提一句避坑:别把 MinGW 和 MSYS2 搞混了。MinGW 是一套编译器工具链,MSYS2 是个包管理系统,它内部集成了 MinGW-w64。很多人问「为什么我装完 MSYS2 找不到 gcc」,因为还需要用 pacman 单独安装 mingw-w64-x86_64-gcc 包。我自己吃过这个亏,第一次用时以为装完 MSYS2 就万事大吉了……然后报错说 gcc: command not found,查了十分钟才明白。嗯,这里提醒你一下。