如果你想在 Windows 上进行 C/C++ 编程,不想动用 Microsoft Visual Studio 大家伙,又要安装像 GCC、Make、Cmake、Clang 这样的编译器,MSYS2 是不二之选。本文总结了我在安装使用 MSYS2 遇到的问题以及解决方法。
MSYS2 官网:https://www.msys2.org/
问题一:MSYS2 安装到 50% 卡住了

解决:请动用你的智慧解决连接外网的问题(在此省略一万字),才能顺利完成安装。

不懂怎么办?
安装到50%强行结束安装进程,此时 MSYS2 已经安装完的了,找出 MSYS2 目录下的 ucrt64.exe 运行。

问题二:MSYS2 有 CLANG64、MINGW64、UCRT64 等部件,怎么选?
| 部件名称 | 运行时库 | 编译器 | 适用系统 | 简单理解 |
|---|---|---|---|---|
| UCRT64 | UCRT (现代) | GCC | 64位 Windows | 现在的首选标准,最像现代 Windows 自家的东西。 |
| MINGW64 | MSVCRT (旧版) | GCC | 64位 Windows | 传统经典款,为了兼容老系统或旧代码。 |
| CLANG64 | UCRT (现代) | Clang | 64位 Windows | 给喜欢 Clang/LLVM 的人用,错误提示更友好。 |
| MSYS | cygwin (模拟层) | GCC | 64位 Windows | 系统维护专用,用来跑一些复杂的 Linux 脚本。 |
| ClangArm64 | UCRT (现代) | Clang | ARM 架构 | 给 Surface Pro X 或新款 ARM 笔记本用的。 |
对于 99% 的小白用户,或者想在 VS Code / SublimeText 里写 C/C++:
首选:UCRT64
这是目前官方最推荐、最现代化、bug 最少的选择。
问题三:初次运行 MSYS2,怎么开始?
MSYS2 使用 pacman 包管理程序安装和删除必要的程序和库。第一次运行 MSYS2 就要运行 :
pacman -Syyu
问题四:pacman命令总是报错连接失败?
如果报错:failed retrieving file ‘mingw32.db’ from mirror.msys2.org: Connection timed out … 或者出现 403、404错误,默认是连接国外镜像源的,需要切换国内的阿里源或清华源。

解决:
打开 MSYS2 安装目录的 etc\pacman.d 目录下的所有mirrorlist文件,在 Tier2 找到 aliyun 一行,复制粘贴到 Primary 下面,保存。然后对目录内其他 mirrorlist文件都如法炮制。

我这里用阿里源示范。为什么不用清华源?
其实我一开始就切换为清华源,但在下载过程中仍出错,导致最后虽然勉强完成了安装GCC编译器,但是编译器链路不完整,无法正常编译任何C/C++代码,后来改为阿里源重新来一遍就正常了。
接下来继续:

第一次运行会提示:To complete this update all MSYS2 processes including this terminal will be closed. Confirm to proceed [Y/n]
输入Y,然后手动重新运行 MSYS2 - UCRT64 程序,再次运行 pacman -Syyu,

直至安装成功。

问题五:如何安装 gcc / make / cmake 编译器?
现在的 MSYS2 只是一个空壳,我们要往里面装入真正的“武器”——编译器。运行:
pacman -S gcc make cmake --noconfirm
其中 --noconfirm 参数不需要用户输入Y继续。

安装完毕,运行 gcc --version 验证版本号。

通常还要安装 MinGW-w64 工具链,它能让你在 Windows 下编译出原生程序。运行:
pacman -S --needed base-devel mingw-w64-x86_64-toolchain --noconfirm
问题六:听说 Windows 环境使用 clang 编译出来的程序性能更快,可以在 UCRT64 环境直接安装 clang 吗?
在 UCRT64 环境里确实可以安装 Clang,但它和 Clang64 环境下的 Clang 有本质上的“血缘”区别。
我们得先聊聊编译器背后的两个“零件”:编译器本身和标准库(也就是代码运行时的地基)。
| 特性 | UCRT64 环境下的 Clang | Clang64 环境下的 Clang |
|---|---|---|
| 底层引擎 (Runtime) | UCRT (微软现代运行时) | UCRT (微软现代运行时) |
| C++ 标准库 | libstdc++ (来自 GCC) | libc++ (来自 LLVM/Clang 原生) |
| 链接器 | ld (来自 GNU) | lld (来自 LLVM) |
| 设计初衷 | 兼容性:让习惯用 GCC 环境的人临时用一下 Clang。 | 纯血性:全套 LLVM 工具链,性能和特性最完整。 |
如果你在 UCRT64 环境里运行 pacman -S clang 安装了 mingw-w64-ucrt-x86_64-clang,这个 Clang 会像一个“外来务工者”。它在编译代码时,会去借用 GCC 的那套工具和库(libstdc++)。
优点:你可以把 Clang 编译出来的东西和 GCC 编译出来的东西混合在一起用,因为它们的“地基”是一样的。
缺点:你无法享受到 Clang 的一些原生特性(比如更先进的静态分析或 libc++ 的特定优化)。
那么,在 Clang64 环境里的 Clang 又是怎样的?
从编译器、链接器到 C++ 标准库(libc++),全部都是 LLVM 家族的产品。
优点:性能更好、对现代 C++ 特性的支持往往比 GCC 的标准库更激进,且编译速度通常更快。
缺点:它编译出来的二进制文件,可能无法简单地与 UCRT64(GCC 体系)编译出来的文件进行混合链接。


298

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



