如何选择和使用 MSYS2 的不同环境
MSYS2 版本列表包含了 Clang 和 UCRT64,提供了更多现代化的工具链选择。我将详细讲解各自的用法,并说明 Windows 10 环境下的最佳选择。
MSYS2 详细使用教程:在 Windows 上构建你的开发利器
MSYS2 是一个在 Windows 上提供类 Unix 开发环境的集合,它允许你轻松地构建、安装和运行原生 Windows 软件。通过强大的包管理器 Pacman,它能让你体验到类似 Arch Linux 的便捷性。
一、安装与初步设置
安装和首次更新必各执行 pacman -Syu
一次,也就是说共执行 2 次该命令,确保系统完全更新。
二、MSYS2 终端环境概览
MSYS2 提供了多个不同的终端环境,它们的核心区别在于 PATH
环境变量的配置,从而决定了默认使用的编译器、库以及可执行文件的查找顺序。理解这些差异对于选择正确的开发环境至关重要。
-
MSYS (MSYS2 MSYS)
- 环境特点: 这是最基础的 MSYS2 环境,其
PATH
环境变量主要包含了 MSYS2 自身维护的工具链(位于msys64\usr\bin
)。这些工具大部分是从 Cygwin 项目移植而来,用于模拟类 Unix 环境。它使用的编译器和库也是 MSYS2/Cygwin 风格的,它们生成的程序可能依赖于msys-2.0.dll
动态链接库。 - 编译器/工具链: 不包含原生 Windows 的 MinGW-w64 或 Clang 工具链。
- 主要用途:
- 管理 MSYS2 自身: 这是执行
pacman
命令(例如pacman -Syu
更新系统、安装 Pacman 自身的包等)的推荐环境。 - 运行类 Unix 脚本和工具: 如果你需要运行那些在 Windows 上没有原生版本,但又不想依赖 MinGW-w64 或 Clang 编译出的原生 Windows 程序的脚本或工具,这里是你的选择。
- 管理 MSYS2 自身: 这是执行
- 总结: 这是一个“内部”环境,主要用于维护 MSYS2 系统本身。
- 环境特点: 这是最基础的 MSYS2 环境,其
-
MINGW64 (MSYS2 MINGW64)
- 环境特点: 这是 构建原生 64 位 Windows 应用程序的传统首选环境。其
PATH
环境变量被配置为优先查找msys64\mingw64\bin
目录下的工具。这个目录下包含了 MinGW-w64 项目提供的 GCC 编译器套件(例如gcc.exe
,g++.exe
)以及其他原生 Windows 工具。这些工具编译出的程序是完全原生的 Windows 可执行文件(.exe
)或动态链接库(.dll
),不依赖于msys-2.0.dll
。 - 编译器/工具链: MinGW-w64 GCC (64位)。
- 主要用途:
- 开发 64 位原生 Windows 应用程序: 使用传统的 GCC 工具链编译 C/C++、Fortran 等程序的标准环境。
- 使用构建系统: 配合 CMake、Meson 等构建系统,可以轻松编译开源项目。
- 兼容性: 对于一些依赖于 GCC 特定扩展或行为的项目,此环境可能是更好的选择。
- 总结: 如果你习惯使用 GCC,或项目对 GCC 有特定依赖,这是你的工作重心。
- 环境特点: 这是 构建原生 64 位 Windows 应用程序的传统首选环境。其
-
UCRT64 (MSYS2 UCRT64)
- 环境特点: 这是 构建原生 64 位 Windows 应用程序的现代化推荐环境。其
PATH
环境变量被配置为优先查找msys64\ucrt64\bin
目录下的工具。这个环境的显著特点是其 C 运行时库 (CRT) 使用的是 Windows Universal CRT (UCRT)。UCRT 是 Windows 10 及更高版本上,以及通过更新在旧版 Windows 上可用的现代化 C 运行时库,它提供了更好的兼容性和最新的 C 标准特性。 - 编译器/工具链: 通常也是 MinGW-w64 GCC (64位),但链接到 UCRT。
- 主要用途:
- 开发现代 64 位原生 Windows 应用程序: 推荐用于新项目,因为它使用最新的 Windows CRT,通常提供更好的兼容性和更小的运行时分发尺寸(UCRT 通常已预装在现代 Windows 系统中)。
- 与 Visual Studio 编译的组件更好的互操作性: UCRT 是 Visual Studio 2015 及更高版本使用的默认 CRT,因此与用 MSVC 编译的库和应用程序有更好的兼容性。
- 总结: 对于大多数现代 Windows 10 上的 64 位原生开发,这是新的推荐选项。
- 环境特点: 这是 构建原生 64 位 Windows 应用程序的现代化推荐环境。其
-
CLANG64 (MSYS2 CLANG64)
- 环境特点: 这是 使用 Clang/LLVM 编译器构建原生 64 位 Windows 应用程序的环境。其
PATH
环境变量被配置为优先查找msys64\clang64\bin
目录下的工具。Clang 是一个优秀的替代编译器,以其快速编译、清晰的错误信息和对 C++ 标准的良好支持而闻名。它也使用 UCRT 作为其 C 运行时库。 - 编译器/工具链: Clang/LLVM (64位)。
- 主要用途:
- 开发 64 位原生 Windows 应用程序,并希望使用 Clang 编译器: 如果你偏爱 Clang 的特性,或者你的项目需要 Clang 来构建。
- 代码分析和工具链: Clang/LLVM 生态系统提供了丰富的代码分析工具(如 Clang-Tidy, Clang-Format)和更强大的优化能力。
- 总结: 喜欢 Clang 或需要其特定优势的开发者的选择。
- 环境特点: 这是 使用 Clang/LLVM 编译器构建原生 64 位 Windows 应用程序的环境。其
-
CLANGARM64 (MSYS2 CLANGARM64)
- 环境特点: 这是 使用 Clang/LLVM 编译器为 ARM64 架构构建原生 Windows 应用程序的环境。其
PATH
环境变量被配置为优先查找msys64\clangarm64\bin
目录下的工具。 - 编译器/工具链: Clang/LLVM (针对 ARM64 架构)。
- 主要用途:
- 为 Windows on ARM 设备开发应用程序: 如果你需要为 Surface Pro X 或其他基于 ARM 处理器的 Windows 设备编译原生应用程序,这就是你的选择。
- 总结: 非常小众,仅针对 ARM64 Windows 平台的开发。
- 环境特点: 这是 使用 Clang/LLVM 编译器为 ARM64 架构构建原生 Windows 应用程序的环境。其
Windows 10 环境下的最佳选择
在当前的 Windows 10 环境下,最佳的选择通常是使用 MSYS2 UCRT64
终端。
理由如下:
- 现代化与兼容性: UCRT 是 Windows 10 及更高版本上的标准 C 运行时库。使用 UCRT 编译的程序在现代 Windows 系统上具有更好的兼容性,且运行时依赖更少(因为 UCRT 通常已作为系统组件存在)。与 MinGW-w64 (默认链接到
msvcrt.dll
) 相比,UCRT64 提供了更接近 Visual Studio 的开发体验和更好的互操作性。 - 普遍适用性: 对于大多数新的 64 位 Windows 应用程序开发,UCRT64 是一个健壮且推荐的工具链。
- 未来趋势: 随着 Windows 操作系统和开发工具的演进,使用 UCRT 作为运行时库是越来越推荐的方式。
什么时候可能需要使用其他终端?
MSYS2 MINGW64
:- 如果你有遗留项目或特定的第三方库,它们可能更倾向于或只能使用传统的 MinGW-w64 GCC 工具链(即链接到
msvcrt.dll
)。 - 习惯于旧版 MSYS2 的用户,或者项目明确要求使用此环境。
- 如果你有遗留项目或特定的第三方库,它们可能更倾向于或只能使用传统的 MinGW-w64 GCC 工具链(即链接到
MSYS2 CLANG64
:- 如果你明确希望使用 Clang/LLVM 编译器。Clang 通常提供更快的编译速度、更清晰的诊断信息和更强大的代码分析工具(如 Clang-Tidy)。对于 C++11/14/17/20 等新标准的支持也非常好。
- 如果你正在处理的代码库需要 Clang 特有的语言扩展或优化。
MSYS2 MSYS
:- 当你需要对 MSYS2 本身进行系统维护(例如,通过
pacman -Syu
更新核心组件,尽管这个操作在 UCRT64/MINGW64 终端中也可以发起,然后 Pacman 会自动切换到正确的环境来执行核心组件的更新)。 - 如果你需要运行一些纯粹的类 Unix 命令行工具或脚本,它们可能不是为了生成原生 Windows 可执行文件而设计的。
- 当你需要对 MSYS2 本身进行系统维护(例如,通过
MSYS2 CLANGARM64
:- 只有当你明确目标平台是 ARM64 架构的 Windows 设备时才需要。这是一个非常具体的用途。
简而言之:
- 大多数用户和新项目:
MSYS2 UCRT64
(如果你是 C/C++ 开发者,这通常是最佳起点)。 - 偏爱 Clang 编译器:
MSYS2 CLANG64
。 - 遗留项目或特定 GCC 依赖:
MSYS2 MINGW64
。 - 系统维护:
MSYS2 MSYS
(但在其他终端中执行pacman -Syu
通常也足够)。 - ARM64 开发:
MSYS2 CLANGARM64
。