什么是 MSYS2 环境?我该如何选择一个?

Hol*_*Cat 7 mingw msys mingw-w64 msys2

据说MSYS2有不同的环境

这些是什么?我该如何选择使用哪一个?


(本问答旨在作为该主题的规范副本。)

Hol*_*Cat 16

参见官方手册。提供以下环境:UCRT64、MINGW64、CLANG64、MSYS 等(请参阅链接)。

\n

UCRT64 是一个很好的默认值,MINGW64 也很流行,但替代方案如下所述。

\n

存在不同的环境来生成不同类型的 Windows 可执行文件,或者使用不同的工具来生成不同类型的 Windows 可执行文件。

\n

每个环境都有自己的包(编译器、预编译库和各种可执行文件),可以通过包名称中的公共前缀来区分(例如mingw-w64-ucrt-x86_64-...对于 UCRT64)。

\n

每个环境将其文件安装到MSYS2 安装内的单独子目录C:\\msys64\\ucrt64,例如 UCRT64 安装到,等等(除了 MSYS 特别安装到C:\\msys64\\usr,以及一些软件包直接安装到C:\\msys64)。

\n

每个环境在“开始”菜单中都有相应的快捷方式,该快捷方式启动 MSYS2 终端并将相应的目录添加到其PATH. 例如PATH 中的MSYS2 UCRT64开头。C:\\msys64\\ucrt64\\bin

\n
    \n
  • 默认情况下,MSYS2 忽略系统范围的PATH设置,并使用完全自定义的 启动其终端PATH,运行echo $PATH以查看它。

    \n
  • \n
  • 所有环境也添加C:\\msys64\\usr\\binPATHafter C:\\msys64\\<env>\\bin。因此,在某种程度上,所有环境都继承自 MSYS 环境。下面详细介绍一下。

    \n
  • \n
  • 环境还自定义了一些其他的环境变量,printenv自己运行看看。

    \n
  • \n
\n

MSYS2 终端在终端提示符中以洋红色文本显示当前环境。

\n

特定环境下如何使用?

\n
    \n
  1. 您安装的所有软件包都必须有适当的名称前缀。例如对于 UCRT64,mingw-w64-ucrt-x86_64-...(其他环境请参见下表)。

    \n

    这适用于所有编译器、库等。因此,如果您想在 UCRT64 中安装 GCC,请使用pacman -S mingw-w64-ucrt-x86_64-gcc,而不是pacman -S gcc

    \n

    唯一的例外是从 Linux 移植的与编译过程无关的实用程序,例如grepsedbash等,它们没有前缀包。

    \n

    没有前缀的包都属于MSYS环境。

    \n

    警告:通常您可以为多个环境安装软件包,并且它们不会相互干扰,除了无前缀的 MSYS 软件包适用于PATH所有环境,其中一些软件包妨碍您。例如,如果您安装了pacman -S gcc,忘记安装了pacman -S ...-gcc,然后尝试从 MSYS 以外的任何环境运行gcc,您将调用 MSYS 环境的 GCC,而不是您环境的 GCC。大多数时候这不是您想要的,并且您会收到神秘的错误。

    \n

    (值得注意的例外是make,它的带前缀和不带前缀的软件包使用不同的可执行文件名称,因此它们不会冲突,可以同时安装,并且都是可行的选项。带前缀的版本(安装为 )运行速度更快mingw32-make,但无前缀的路径函数通过返回 Linux 风格的路径来提供更好的 Linux 兼容性。)

    \n
  2. \n
  3. 如果您使用 MSYS2 终端,请使用适当的快捷方式启动终端

    \n

    快捷方式中包含环境名称,例如对于 UCRT64,请使用MSYS2 UCRT64快捷方式。

    \n
  4. \n
  5. 如果您不使用 MSYS2 终端并从其他地方调用工具,请将适当的目录添加到 PATH,例如对于 UCRT64 add C:\\msys64\\ucrt64\\bin

    \n

    在极少数情况下,您可能还需要添加C:\\msys64\\usr\\bin. 如果这样做,请确保将其添加到前面提到的目录之后。

    \n

    为了避免出现问题,最好将这些目录直接放在PATH(系统范围的和特定于用户的)的开头。

    \n
  6. \n
\n

环境如何选择?

\n

对于大多数用途来说,UCRT64 应该是一个很好的默认值。

\n

否则,选择取决于:

\n
    \n
  • 首选编译:GCC 或 Clang(有些同时提供)。
  • \n
  • 首选 C++ 标准库(GCC 的 libstdc++ 或 Clang 的 libc++,有些两者都提供)。
  • \n
  • 首选 C 标准库(旧的 MSVCRT 或支持 UTF-8 的新 UCRT)。
  • \n
  • 您是否需要消毒剂(地址消毒剂、UB 消毒剂等)。
  • \n
  • 您是否需要Cygwin风格的 POSIX 仿真。
  • \n
  • 是否要为 ARM 生成可执行文件
  • \n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n
环境UCRT64明GW64铿锵64系统管理系统
安装到
(通常相对于 MSYS2 安装
目录C:\\msys64\\...
/ucrt64/mingw64/clang64/usr
(一些包裹到/?)
包前缀mingw-w64-ucrt-x86_64-mingw-w64-x86_64-mingw-w64-clang-x86_64-没有任何
目标架构x86_64x86_64x86_64赛格温 x86_64
编译器GCC(也称为 Clang)GCC(也称为 Clang)GCC(还有 Clang)
(可能已经过时)
C++标准库libstdc++(也称为 libc++)libstdc++(也称为 libc++)库++libstdc++ 库
C标准库UCRT多中心静脉曲张放疗UCRT西格温
消毒剂11是的1
\n
\n

1 \xe2\x80\x94 UBSan 可以工作,但它无法打印诊断信息,并且只能在出错时崩溃。

\n

目标架构变体:

\n
    \n
  • 32位

    \n

    上述所有环境都会生成 x64 可执行文件(又名 x86_64)。

    \n

    还有 x32 可执行文件(又名 i686)的环境:MINGW32CLANG32.

    \n

    它们与各自的 x64 环境类似,只不过文件安装到/...32目录而不是/...64,并且包前缀包含i686代替x86_64

    \n
  • \n
  • 手臂

    \n

    上述所有环境都会生成x86(x32 或 x64)的可执行文件。这是大多数台式机和笔记本电脑运行的系统。

    \n

    显然现在有一些ARM笔记本电脑也运行 Windows。虽然他们可以模拟 x86 来运行 x86 应用程序,但本机 ARM 应用程序应该具有更好的性能。

    \n

    CLANGARM64 环境可用于生成 ARM(又名 aarch64)应用程序。它与 CLANG64 类似,只不过文件安装到/clangarm64,并且包以mingw-w64-clang-aarch64-.

    \n
  • \n
\n

C 标准库,MSVCRT 与 UCRT:

\n

手册很好地解释了其中的差异。

\n

简而言之:

\n
    \n
  • MSVCRT ( msvcrt.dll):

    \n
      \n
    • 旧的,来自Microsoft Visual Studio 6.0。

      \n
    • \n
    • 直到几年前,这还是 MinGW 的唯一选择。

      \n
    • \n
    • 路径不支持 UTF-8,必须使用 UTF-16 并wchar_t处理路径中的 unicode。

      \n
    • \n
    \n
  • \n
  • UCRT ( ucrtbase.dll)

    \n
      \n
    • 新颖而闪亮,这就是当代 Visual Studio 所使用的。

      \n
    • \n
    • 默认情况下在 Windows 10 上可用,在之前的 Windows 版本上必须手动安装。

      \n
    • \n
    • 如果您在应用程序中启用 UTF-8 区域设置,则支持路径中的 UTF-8。

      \n
    • \n
    \n
  • \n
\n

MSYS环境:

\n

该环境基于 MSYS2 自己的Cygwin分支分支,它是一个 POSIX 模拟层。

\n

它主要用于编译不是以跨平台方式编写的 Linux 应用程序。可以说,应用程序首先应该以跨平台方式编写,然后使用其他环境进行编译。

\n

MSYS2 使用它来提供bash, grep, sed,awk和其他 Linux 上常用的命令行实用程序。

\n

根据我有限的理解,MSYS 应用程序通常仅在 MSYS2 shell 内部用于开发目的,而不分发给用户。

\n

除此之外,用它编译的应用程序会看到 Linux 风格的所有路径:以正斜杠/作为分隔符,将/(根)目录映射到 MSYS2 安装目录,并/c神奇地映射到C:\\(与其他驱动器号类似)。他们还可以访问模拟的 Linux 特定功能,例如fork().

\n

该模拟层具有性能成本。

\n

还应该注意的是,MSYS 似乎没有提供与其他环境一样多的库(和一般的包),并且不会频繁地接收编译器更新。

\n