Windows 上用 MSYS2 折腾 C++ 开发环境这件事,我前前后后花了将近两周才彻底理顺。最开始只是在 VS 里写算法题,后来项目要用 CMake 跨平台编译,又需要 GCC 才有的某些 warning 和 sanitizer,Visual Studio 那套 MSBuild 工程在 Linux CI 上一跑就各种闹脾气。当时试过 WSL,但是文件 IO 和网络代理在虚拟机层转发总有点延迟,尤其是配合 CLion 和 VSCode 的远程开发,体验始终差一口气。兜兜转转才落到 MSYS2 上,这套工具链用到现在已经成为我 Windows 上写 C++ 的主力方案。
这篇东西我会把从零安装、pacman 镜像加速、GCC/CMake 配置、路径污染避坑到 CMake 工程落地跑的完整过程全部写出来,包括那些让人血压飙升的“gcc -v 显示旧版本”“安装卡在 50%”“找不到 -lstdc++”这类问题,把排查思路和最终解法一次性讲透。适合准备入坑开源工具链的 C++ 新手,也适合被 VS 工程迁移折腾到崩溃、想换套干净利落编译流程的同学参考。
1. 整体方案设计与思路拆解
1.1 为什么 Windows 上的 C++ 开发需要折腾这套东西
先说说我为什么放着好好的 Visual Studio 不用,非要折腾这么一套“Linux 味道”的环境。VS 本身是个很优秀的 IDE,我承认它在调试器的易用性上至今无人能比。但它的构建系统——MSBuild 和 .vcxproj——存在很大的问题。
VS 工程文件动辄几千行 XML,团队协作时合并冲突让人抓狂。Windows 上改一行代码,同步到 Linux CI 上编译,大概率会冒出各种“类型不匹配”“找不到头文件”的问题。原因很简单:MSVC 和 GCC 对 C++ 标准的支持程度、模板实例化机制、宏定义的默认行为都有差异。你写的是跨平台 C++,但 VS 的工程配置把你牢牢绑死在 Windows 上。
MSYS2 的思路完全不同。它本质上是在 Windows 上跑了一层 POSIX 兼容层,然后通过自带的 pacman 包管理器维护一套完整的 GNU 工具链。你不需要 CMake 去生成 .sln 文件,也不需要关心 .vcxproj 里那些平台工具集版本号。写 CMakeLists.txt 声明目标,然后 cmake、make、g++ 三个命令搞定一切,这套流程和你在 Ubuntu 上敲的命令一模一样。
1.2 MSYS2、Cygwin、WSL 怎么选
这个问题几乎每个折腾过的人都会纠结。WSL 适合跑完整 Linux 发行版,但做 C++ 开发有个天然的痛点:跨文件系统 IO 慢。如果你把源码放在 /mnt/c/ 下,每次编译都要经过虚拟化层做文件转发,大项目编译起来那叫一个煎熬。想把项目放 WSL 内部文件系统,VSCode 远程连接又需要额外配置,而且 VSCode 的 C++ 插件 remote 模式下很多东西不稳定。
Cygwin 走的是另一条路,它兼容层做得更彻底,但也因此更重。Cygwin 动态库(cygwin1.dll)对 POSIX 的兼容程度近乎“整台机器伪装成 Linux”,对于想要“在 Windows 上原生运行程序”的场合并不合适,而且它的包管理器比 pacman 难用得多。
MSYS2 的正确打开方式是:把 MSYS2 当作包管理器和编译环境启动器,编译出来的程序默认依赖 Windows 原生 API(取决于你选的工具链),不会像 Cygwin 那样要求运行时环境。用 MSYS2 终端跑命令可以获得和 Linux shell 接近的体验,同时编译产物可以直接在 Windows 上运行,不需要额外的 DLL 环境(除非静态链接的是动态库版本)。
如果你还是纠结,我给你一个粗暴的建议:主力开发 Windows 原生 GUI 程序选 MSYS2;需要完整 Linux 生态(部署、跑 Python 包、跑 research 脚本)选 WSL;Cygwin 就别浪费生命了。
1.3 选择 GCC + MSYS2 而非 MSVC 的本质原因
MSVC 编译器和 GCC 在使用层面最大的区别不在于速度,而在于标准支持策略和编译选项体系的差异。GCC 对 C++17、C++20 的很多特性支持得更激进,它对“代码哪里写得有潜在问题”的警告体系也特别完善。比如 -Wall -Wextra -Wpedantic -Wconversion 这套组合,在 MSVC 下要开启 /W4 还不够,很多 warning 根本不提示。
更关键的是,CMake 与 GCC 的组合是开源社区事实上的标准构建流程。你想用的那些第三方库——Boost、fmt、spdlog、GoogleTest、Eigen——它们的官方文档给出的 CMake 集成范例,绝大多数是基于 GCC 测试验证过的。你在 Linux 上用这套,Windows 上也能无缝平移,这才是“Linux 式开发环境”的核心价值。
2. MSYS2 安装与环境准备,把坑填平
2.1 下载与安装:别用旧版本,别放 C:\msys64 之外
MSYS2 的下载源始终在官方 GitHub Releases 页面。注意千万别去各种第三方软件站下载“MSYS2 中文版”,那玩意要么被塞了广告,要么版本旧到连 pacman 都跑不动。
我之前就踩过一次坑,下了个老版本的 MSYS2,结果 pacman -Syu 每次都报错 PGP signature verification failed ,折腾半天才发现是官方改了密钥分发方式,旧版本连带新的 pacman 更新都做不了。所以直接去官方页面拉最新版,文件名一般是 msys2-x86_64-2024xxxx.exe 。
安装路径保持默认 C:\msys64 就好。为什么?因为 MSYS2 的内部环境变量、pacman 脚本、shell 配置都硬编码了这个路径。如果你自作聪明装到 D:\Tools\MSYS2 ,后面遇到的各种 cannot find /usr/bin/bash 、 .bashrc 不生效问题,大概率都和路径异常有关。
安装过程中如果卡在“Installing 50%”这种阶段,别急着关窗口,先检查是不是杀毒软件在实时扫描。Windows Defender 对 MSYS2 的 bash.exe 和 gcc.exe 有时候会做全量扫描,导致解包极慢,甚至假死。处理方法是把 C:\msys64 整个目录加入 Defender 排除项,然后把安装包也加入排除项。如果你公司电脑装了第三方安全软件,务必确认它不会拦截 newlib 和 binutils 关键文件的写入。
2.2 第一次启动:pacman -Syu 的正确姿势与镜像加速
安装完成后启动 MSYS2 MSYS 终端,第一件事就是执行更新:
pacman -Syu
这个命令会同步仓库并更新所有核心包。但国内直连官方源速度非常感人,经常几 KB/s,而且容易在下载中途报 failed retrieving file ... could not resolve host 。
解决办法是换成清华 TUNA 镜像或者中科大镜像。以清华为例,编辑 /etc/pacman.d/mirrorlist.msys ,把文件里的 Server 行替换或前置为:
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
注意,MSYS2 仓库分成三个: msys (shell 和基础工具)、 mingw64 (64 位 Windows 原生程序)、 mingw32 (32 位)。对应的配置文件有三个:
-
/etc/pacman.d/mirrorlist.msys -
/etc/pacman.d/mirrorlist.mingw64 -
/etc/pacman.d/mirrorlist.mingw32
三个文件都要替换成同样的清华地址,只是最后的 $repo/$arch 部分会略有区别,通常清华镜像提供的是统一路径 msys2/$repo/$arch ,直接全部替换即可。
替换完再执行一次:
pacman -Syu
如果之前因为强制关闭导致部分包处于锁状态,先执行:
rm -rf /var/lib/pacman/db.lck
这个锁文件是 pacman 防止并发修改的机制。很多人碰到“卡住”“一直等待”都是因为这个残留锁。
2.3 pacman 核心命令速查
这套包管理器是 MSYS2 的灵魂,我用顺了之后觉得比 apt 还清晰。以下命令请当作肌肉记忆来背:
pacman -Ss 关键词 # 搜索包
pacman -S 包名 # 安装包
pacman -Sy # 刷新仓库但不升级(慎用,见到 Y 之后再说)
pacman -Syu # 刷新仓库并全量升级
pacman -R 包名 # 卸载单个包
pacman -Rs 包名
1万+




被折叠的 条评论
为什么被折叠?



