快速了解 MSYS2

官方wiki文档中有简介msys2,比较CygWIN 的异同,以及与 MinGW 关系。
下面截取其中片段并翻译,以快速了解 MSYS。

MSYS2 is software distribution and a building platform for Windows. It provides a Unix-like environment, a command-line interface and a software repository making it easier to install, use, build and port software on Windows. That means Bash, Autotools, Make, Git, GCC, GDB..., all easily installable through Pacman, a fully-featured package manager.
MSYS2 是针对 Windows 的软件分发和构建平台。 它提供了一个类 uni x的环境,一个命令行界面和一个软件库,使得在Windows上安装、使用、构建和移植软件更加容易。 这意味着 Bash, Autotools, Make, Git, GCC, GDB… ,都可以通过Pacman,一个全功能的包管理器轻松安装。

It is an independent rewrite of MSys, based on modern Cygwin (POSIX compatibility layer) and MinGW-w64 with the aim of better interoperability with native Windows software.
它是基于现代Cygwin (POSIX兼容层)和 MinGW-w64,对MSys的独立重写版本,目标是与本地Windows软件更好的互操作性。

1. 子系统 Subsystems

MSYS2 consists of three subsystems and their corresponding package repositories, msys2, mingw32, and mingw64.
MSYS2由三个子系统及其相应的软件包库MSYS2、mingw32和mingw64组成。

  1. mingw 子系统提供原生的 Windows 程序,构建是为了与其他 Windows 程序合作,而独立于其他子系统。
  2. msys2 子系统为编译软件、包管理和 shell脚本 提供了一个主要与 posix 兼容的仿真环境。

2. 文件系统 File system

Paths Contents
/bin, /dev, /home, /opt, /proc, /tmp, /var essential POSIX stuff
/etc, /usr msys2 subsystem
/mingw32, /mingw64 mingw subsystems
/c, /d, ... mount points for Windows drives
/.xml, /maintenancetool., InstallationLog.txt (un)installer
/autorebase.bat, /msys2_shell.cmd, /msys2.ico shell entry points

3. 安装和升级

参考 https://www.msys2.org/wiki/MSYS2-installation/

4. Cygwin vs MSYS2 [1]

  1. 目标:Cygwin 试图将 posix 兼容的环境引入 Windows,使大多 linux 软件可在 Cygwin 上构建和运行。Cygwin 的主要构成是完成这一目标的。 MSYS2 试图提供一个构建本地 Windows 软件的环境。主要构成是提供windows 构建和运行的软件包和库,只是大部分软件使用的是与unix紧密耦合的GNU构建工具,因此也是 posix 兼容的。

  2. 包管理:MSYS2 使用 Pacman 管理,Cygwin只附带Cygwin相关的软件。它使用自己的包管理系统,通常称为setup.exe。

    • msys2: Containing MSYS2-dependent software
    • mingw64: Containing 64-bit native Windows software (compiled with mingw-w64 x86_64 toolchain)
    • mingw32: Containing 32-bit native Windows software (compiled with mingw-w64 i686 toolchain)
  3. 运行时:Cygwin提供了一个名为cygwin1.dll的运行时库,它在必要时提供了POSIX兼容层。这个库的MSYS2变体称为msys-2.0.dll。

5.MSYS2 vs MinGW[2]

网上关于MSYS和MinGW介绍也比较多,区别和联系也不少。打个形象但不恰当的比方:

MSYS 相当于操作系统(如Windows),这个操作系统提供的软件、接口等和Linux相似
MinGW 相当于开发工具包(如MSVC),这个开发工具包可以运行在 MSYS 下,包里的工具也可以运行在Windows下,编译结果是Windows程序。
主要常见问题:

  1. MSYS 也可以安装 gcc,make等工具(我们称之为MSYS编译器),这些工具安装在 /usr/bin 路径下,MinGW 的工具安装在 /mingw/bin 下。这两套工具都可以编译程序。所以初次使用时经常会出现这样的疑问:究竟运行 msys2.exe 还是 mingw64.exe 来启动控制台?

    回答: MSYS2 和 MinGW 都提供 gcc,但是属于两个完全不同的工具链。前者属于 msys2-devel ,后者属于 mingw-w64-$arch-toolchain。使用 mingw-gcc 编译的目标文件是原生的,而使用 msys2-gcc 编译的目标文件依赖于 msys-2.0.dll 提供的虚拟 POSIX 环境。如果你要编译的东西强依赖于 POSIX syscall (比如 fork 等),那么就要用 MSYS2 的 gcc。而如果是要当做一个 release 拿去给别人用的,用 MinGW 的 gcc 好些。当然,事情也不绝对,对于前者你也可以给源文件 patch 一个 MinGW 移植,对于后者也可以用 MSYS2 然后附带上 msys-2.0.dll。根据我自己的经验,如果你使用目标文件的环境就是 MSYS2 的话,用 MSYS2 工具链编译的程序要比 MinGW 工具链的稳定一些(对 ruby, python 等工具而言)。

  2. MSYS的CMake 和 MinGW 的 CMake ?

    • MSYS中安装的CMake默认配置 Makefile 项目,会生成一个 Makefile 文件。
    • MinGW中安装的CMake默认配置 MSVC 项目,会生成一个 VS 的 sln 文件(没错,生成 VS 工程)。如果要用 MinGW ,需要 cmake -G "MinGW Makefiles" 以生成供 mingw32-make 编译的 makefile 文件。
  3. 如何在 Windows 上直接调用 MinGW ?

    回答:在环境变量 PATH 中加入 /mingw64/bin 就可以直接使用 gcc 等工具了。但是,如果使用的是绝对路径(如 D:\msys2\mingw64\bin\gcc.exe )则编译没有结果,应该是失败了。这样其实在 Windows 上可以不用单独安装 CMake ,直接在 MinGW64 中安装一个就可以了。

6. MinGW 安装[3]

Cmake的工作流程
MinGW 安装选项说明
  • Architecture:i686是32位,x86_64是64位系统。
  • Thread: win32对应开发Windows程序,posix对应其它
  • Exception: 当Architecture是i686时,此处可选sjlj和dwarf,当Architecture是x86_64时,此处可选sjlj和seh

Reference


  1. https://www.msys2.org/wiki/How-does-MSYS2-differ-from-Cygwin/ ↩︎

  2. https://zhuanlan.zhihu.com/p/266448826 ↩︎

  3. MinGW-w64 C/C++编译器下载和安装 ↩︎

posted @ 2022-04-06 14:12  Oddpage  阅读(2820)  评论(0编辑  收藏  举报