免责声明

有部分内容是机翻的,想看省流版本的去到结尾

写在前面

因为最近闲的没事干,笔者准备写个小脚本来爬蔚蓝档案吧的二创贴,顺便做个监控和排名。但是,当笔者准备打开命令行,新建虚拟环境的时候,发现copy出来的是3.11.7,如果我没记错的话,我的python是跟着winget更新的,最新的应该是3.12.1,虽然就一个小小的版本的区别,我就很奇怪了,在命令行里面where python

1
2
3
4
where python
C:\msys64\ucrt64\bin\python.exe
C:\Users\13059\AppData\Local\Programs\Python\Python312\python.exe
C:\Users\13059\AppData\Local\Microsoft\WindowsApps\python.exe

这就有点意思了,msys2里也装了一个,但我印象里面我也没用过msys2装过python啊,合着上次装工具链的时候一起装的?不过我之前一直用另一台电脑,还真没留意这个东西。

这不是什么大的问题,真正的问题是,Windows下面的环境变量管理实在是逆天,别的系统都是用户配置优先的,到了Windows就是反过来的,系统配置优先?我TM,用户配置里面,我自己装的在msys2的上面,但是,系统配置里面是没有我自己装的,这就引发出个问题,我到底是把用户目录下面的加到系统配置里面呢?还是把python拷贝到其他地方去?如果是第一种方案,就会导致环境配置混乱,第二种方案,不方便更新。可见,Windows下面的运行环境简直就是依托答辩,各种东西到处乱飞。

因为笔者主要还是使用Linux较多,所以决定看看msys2好不好用,看看能不能替代其他玩意作为包管理器和管理运行环境。

简介

msys2的官方网站上面说的很明白,Windows上的软件分发和构建平台,包含了很多的库和工具,有一个bash终端,和arch一样的pacman包管理器,一些从cygwin项目移植过来的unix工具,还有很多基于Windows的原生预构建软件包,包括了常用的运行环境和工具。

当然,笔者认为以上这对废话初学者大概率都看不懂,简而言之,msys2项目就是让很多的unix软件可以在Windows上运行,或者说将unix软件移植到windows上,并且让你在命令行里面可以用unix的习惯写命令。

安装

翻译并精简自官方文档

  1. 下载 安装包 msys2-x86_64-20240113.exe (系统需要64位 版本8.1以上)
    这里笔者要提一嘴,这个安装包是写这篇文章时官方给出的最新的,如果以后官方更新了,你用旧的安装包也是没有问题的,在安装完之后可以手动对核心组件进行更新,而且每次检查更新时都会更新核心组件。
  2. 双击运行安装,然后全部默认,下一步,直到完成。
    install-2-path
    install-3-finish
  3. 现在msys2已经准备就绪,并且会启动一个ucrt64环境的终端。
    install-4-terminal-dark
  4. 现在你就可以安装各种工具比如mingw-w64 gcc来编译项目,我们来尝试一下。
    1. 输入以下命令安装gcc
      1
      $ pacman -S mingw-w64-ucrt-x86_64-gcc
    2. 终端会显示以下内容,按下回车键或者输入y后回车表示继续安装
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      resolving dependencies...
      looking for conflicting packages...

      Packages (15) mingw-w64-ucrt-x86_64-binutils-2.41-2
      mingw-w64-ucrt-x86_64-crt-git-11.0.0.r216.gffe883434-1
      mingw-w64-ucrt-x86_64-gcc-libs-13.2.0-2 mingw-w64-ucrt-x86_64-gmp-6.3.0-2
      mingw-w64-ucrt-x86_64-headers-git-11.0.0.r216.gffe883434-1
      mingw-w64-ucrt-x86_64-isl-0.26-1 mingw-w64-ucrt-x86_64-libiconv-1.17-3
      mingw-w64-ucrt-x86_64-libwinpthread-git-11.0.0.r216.gffe883434-1
      mingw-w64-ucrt-x86_64-mpc-1.3.1-2 mingw-w64-ucrt-x86_64-mpfr-4.2.1-2
      mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-4
      mingw-w64-ucrt-x86_64-winpthreads-git-11.0.0.r216.gffe883434-1
      mingw-w64-ucrt-x86_64-zlib-1.3-1 mingw-w64-ucrt-x86_64-zstd-1.5.5-1
      mingw-w64-ucrt-x86_64-gcc-13.2.0-2

      Total Download Size: 49.38 MiB
      Total Installed Size: 418.82 MiB

      :: Proceed with installation? [Y/n]
      [... downloading and installation continues ...]
    3. 我们来测试一下gcc
      1
      2
      $ gcc --version
      gcc.exe (Rev2, Built by MSYS2 project) 13.2.0

环境

笔者认为官方文档中,这一篇比较重要,关系到很多东西。

msys2具有很多不同的环境(笔者注:指命令行环境),所以首先你要做的就是选择使用哪一个。不同的环境之间的区别主要是环境变量默认的编译器/连接器处理器架构使用的系统库等等。如果你不确定使用什么,用ucrt64准没错。

补充
你在应用程序里会看到这几个玩意。
9e3bd01065c08d9261894b22bf751986.png
你点进去就会打开一个终端窗口粉红色的字就是当前的环境。
install-4-terminal-dark

MSYS 环境包含基于类 unix/cygwin 的工具,位于 /usr 下,其特殊之处在于它始终处于活动状态。所有其他环境都继承自 MSYS 环境,并在其之上添加各种内容。

例如,在 UCRT64 环境中,$PATH 变量以 /ucrt64/bin:/usr/bin 开头,因此您可以获得所有基于 ucrt64 的工具以及所有 msys 工具。

概览

11cb6103a42cea7f463686c851c2106f.png

GCC 还是 LLVM/Clang

这些是用在相应存储库中构建所有包的默认编译器/工具链。

基于GCC的环境:

  • 目前已广泛测试/使用
  • Fortran 支持
  • 虽然 MINGW 环境中也存在 Clang 包,但该包仍然使用 GNU 链接器GNU C++ 库。在某些情况下,Clang 也用于构建软件包,例如,上游更喜欢 Clang 而不是 GCC

基于LLVM/Clang的环境:

  • 仅使用LLVM工具,LLD作为链接器,LIBC++作为C++标准库
  • Clang 提供 ASAN 支持
  • TLS(线程本地存储)的本机支持
  • LLDLD 更快,但不支持 LD 支持的所有功能
  • 某些工具缺乏与等效 GNU 工具相同的功能
  • 支持 Microsoft Windows 10 上的 ARM64/AArch64 架构

MSVCRT 还是 UCRT

这是 Microsoft WindowsC 标准库的两个变体。

MSVCRT(Microsoft Visual C++ Runtime)默认在所有 Microsoft Windows 版本上可用,但由于向后兼容性问题一直停留在过去,不兼容 C99 并且缺少一些功能。

  • 它不兼容 C99,例如 printf() 函数系列,但是……
  • mingw-w64 提供了替换函数,使其在很多情况下兼容 C99
  • 它不支持 UTF-8 区域设置
  • MSVCRT 链接的二进制文件不应与 UCRT 链接的二进制文件混合,因为内部结构和数据类型不同。(更严格地说,为不同目标构建的对象文件或静态库不应混合。为不同 CRT 构建的 DLL 可以混合,只要它们不共享 CRT 对象,例如FILE*DLL 边界。)同样的规则适用于MSVC 编译二进制文件,因为 MSVC 默认使用 UCRT(如果不更改)。
  • 可在 Microsoft Windows 的每个版本上开箱即用。

UCRT(通用 C 运行时)是一个较新的版本,Microsoft Visual Studio 也默认使用它。它的工作和行为应该就像代码是用 MSVC 编译的一样。

  • 在构建时和运行时比 MSVC 具有更好的兼容性。
  • 它作为 Windows 10 或更高版本以及 Windows Server 2016 或更高版本中操作系统的一部分包含在内。对于较旧的 Windows 版本,您必须明确提供它或取决于安装它的用户。有关这方面的更多信息,请参阅UCRT 部署

添加到终端

因为笔者只有Windows Terminal,所以只有这个的步骤。

  1. 打开终端,在下拉选项卡里找到设置
    5a52b97fdd561f9e5a943c70766d7835.png
  2. 左下角打开json文件
    eaefa508c56f0c52b340dff4a33742d1.png
  3. 在json文件里找到"profiles"这一行,把配置加到后面

    补充:
    把大括号里面的内容加进去就行。
    字体和大小可以在设置里面调,比较直观。

    5c80b0c9c5960121e4ff3a7c0e573cc7.png
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    "profiles": {
    "list":
    [
    // ...
    {
    "name": "UCRT64 / MSYS2",
    "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -ucrt64",
    "startingDirectory": "C:/msys64/home/%USERNAME%",
    "icon": "C:/msys64/ucrt64.ico",
    "font":
    {
    "face": "Lucida Console",
    "size": 12
    }
    },
    {
    "name": "MSYS / MSYS2",
    "commandline": "C:/msys64/msys2_shell.cmd -defterm -here -no-start -msys",
    "startingDirectory": "C:/msys64/home/%USERNAME%",
    "icon": "C:/msys64/msys2.ico",
    "font":
    {
    "face": "Lucida Console",
    "size": 12
    }
    },
    // ...
    ]
    }

添加到 IDE

因为笔者只用 VS Code,所以只有这个的。

  1. 在VS Code的设置里找到下图的位置。
    39d943c375365cfcbd80b318fa8470ae.png
  2. 参考下图把这段加进去。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {
    "terminal.integrated.profiles.windows": {
    "MSYS2 UCRT": {
    "path": "cmd.exe",
    "args": [
    "/c",
    "C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64"
    ]
    }
    }
    }
    aaf34ea6adabd407e1e6ecff04bf5259.png

包管理

基本的操作和arch上的pacman一样,直接去参考就行。

包名

所有的包都会有一个代表环境的前缀
94c643a39dec0c465578e8c947d5f33c.png

使用pacboy进行高级搜索

  1. 安装pactoys
    1
    $ pacman -S pactoys
  2. 使用:p来指定环境,例如
    1
    $ pacboy -S x265:u
    具体的后缀可以使用pacboy help查看

仓库镜像

笔者查看了配置文件,个人感觉不需要进行干预,因为里面的镜像网站很齐全。

Git 的问题

笔者参考了官方的文档后,msys2中,git目前只提供了cygwin的版本,只能支持标准的的unix路径,而且与Git for Windows相比,性能很差,尤其是大型仓库。官方在积极解决这个问题。

环境变量

这里先说结论,外面可以读到msys2安装的环境,msys2不能读外面的,很正常,比较设计就是这样的。

尾巴

因为众所周知的原因,Windows就是一个以图形化界面为主的系统。基本没什么人用它的命令行,因为所有工作都可以在图形化界面完成。而Linux不一样,它可以在没有图形化环境的情况下正常使用。然后由于众所周知的原因Linux的桌面环境很难用。你说苹果吧,图形化确实有,命令行确实有,就是没有软件支持。最近个人用得比较舒服的就是Chromebook,可以开Linux虚拟机,图形化界面也处理的好。

MSYS2这个项目一开始给我一种很神奇的感觉,首先它这个移植就很离谱,基本部分是基于cygwin。cygwin这个东西很有意思,用一个动态链接库来处理与POSIX系统调用和环境有关的东西,简单来说就是一个API兼容层。兼容层这个东西会影响一点效率,从Git就可以看出来。所以,MSYS2还包括了一系列的原生构建的软件包,真,从源码构建,直接使用Windows API。MSYS2用Pacman作为包管理器,终于解决了Windows上面没有一个像样的包管理器的问题,各种环境终于不是东一个西一个,还附带了一点滚动更新的优点。自带的bash终端就很有Linux的感觉, 要是你愿意,甚至可以用nano来编辑文件,而且终于不用使用逆天的反斜线写路径了。