Win 下的类 Linux 环境开发/运行环境

Cygwin

Cygwin 旨在通过一些 动态链接库(DLL),以 C 标准库的形式作为 API 兼容性层(转换为 Windows API 调用),提供一个完整的 POSIX 层,包括主流 Unix 的系统调用及库实现,以实现在 Windows 上直接编译和运行 Unix 程序,其重视兼容性优先于性能(这里的兼容性主要是 Unix 程序源码在此环境下编译时的兼容性)。

由于这样的实现方式,在 Cygwin 上开发/编译的程序,在运行时会依赖那些提供了兼容层的 DLL,也就是说需要将 Cygwin 的 DLL 随程序一起发布,才能在其他机器上运行。(这些程序不能完全算是 Windows 原生程序,因为需要 Cygwin 这个调用转换层。)(同时也由于需要转换层,所以说程序性能一般)

MingGW

MinGW 由 Cygwin 发展而来,着重简化与性能(主要提供 GUN 编译套件 gcc g++,而不是近 Unix/Linux 体验?),基于 MinGW 的程序是直接调用 Windows API 编译的(特指 C 语言?其他语言仍然依赖 GUN 运行时库?比如 libstdc++),得到的程序算是完全 Windows 原生的。

但 MinGW 只提供了 Win32 的 API,且不提供 POSIX API,所以大多数 GNU 软件无法在不修改源代码的情况下用 MinGW 编译。MinGW 也在 Linux 下提供了用于交叉编译到 Windows 的环境。

Mingw-w64

Mingw-w64 是从 MinGW 分支出来的,主要用于扩展 MinGW 的特性,比如提供 64 位的开发、Win64 API、pthreads,但是同样不提供完整的 POSIX 兼容。

很多 Windows 下的 IDE 使用其作为默认的编译套件/工具链,比如 Clion、QtCreator 等等(这些 IDE 说什么也是不可能在内部打包一套微软的编译套件的)。

MSYS2

MSYS2 基于修改版的 Cygwin,旨在提供 Windows 原生应用的编译环境。

MSYS2 环境中的大量程序都是 Windows 原生的,比如 GCC, mingw-w64, CPython, CMake, Meson, OpenSSL, FFmpeg, Rust, Ruby 等等。

总结:

  • Cygwin 是一切的基础,在 Windows 上跑 Cygwin 里编译的程序,需要依赖 Cygwin 的 DLL 作为 API 转换层。提供了大量在 Cygwin 环境下编译好的 Unix 应用程序,包括常用的命令。
  • Mingw-w64 主要提供 GUN 编译套件,来生成 Windows 原生应用,如果只安装 Mingw-w64,是不包含很多常用的 Unix 命令的,所以一般不会只安装 Mingw-w64,而是将其安装在某个系统或环境中,比如 Cygwin、MSYS2 或某个 Linux 发行版(提供到 Windows 原生应用的交叉编译)。
  • MSYS2 在层级上看起来最高,Mingw-w64 只是作为其内部环境的一个工具/包。MSYS2 除了提供了大量 Windows 原生的 Unix 命令,在编译程序方面,更像是一个编译环境管理系统,可以提供多个不同的编译套件和底层库:
    • MSYS 环境下是 gcc 编译套件,底层库是 Cygwin DLL 和 libstdc++
    • UCRT64 环境是 gcc 编译套件,底层库是 ucrt 和 libstdc++(较新的默认推荐环境)
    • CLANG64 环境是 llvm 编译套件,底层库是 ucrt 和 libc++
    • MINGW64 环境是 gcc 编译套件,底层库是 msvcrt 和 libstdc++