为什么需要Cygwin和MinGW ?

Why are Cygwin and MinGW necessary?

本文关键字:MinGW Cygwin 为什么      更新时间:2023-10-16

我一直在试图理解Cygwin和MinGW到底是什么,发现它非常令人困惑。如果你想用c++编程,你不需要一个c++编译器吗?从我读到的内容来看,他们似乎在努力为Windows提供一个类似Unix的操作系统,但我不认为这有什么意义。我是说有什么原因c++不能在Windows上原生编译吗?我还读到它们包含库,这是因为c++核心语言不支持许多函数,所以非常常见的库,如math.h附带吗?

这个解释肯定已经写在其他地方了,但无论如何,这里是…

Cygwin是一个建立在Win32 API之上的POSIX兼容运行时。它提供了一个很大程度上兼容的POSIX C库,围绕它,有一种带有包管理器的"Cygwin发行版",允许您安装大量移植到Cygwin下运行的Unix程序。这些包括Unix shell, GCC(用于Cygwin), X,一堆交叉编译器,等等。

MinGW(-w64)是提供免费(如在公共领域)Win32头文件和库的项目。您可以将其视为Windows SDK(旧版本)中头文件和库的免费替代品。它们可以与GCC一起使用。项目和其他第三方都为Windows提供本机GCC构建,这些构建根本不需要Cygwin。这些软件包可以被看作是Windows SDK的"完整"(在MinGW(-w64)的完整程度上)替代品。

请注意,Cygwin也为Win32交叉编译器提供Cygwin:这些编译器运行在Cygwin平台上,但生成本地的Win32可执行文件。

另一个播放器,MSYS,是Cygwin的轻量级分支,它只提供最少量的工具来在Windows上运行autotools构建脚本。MSYS必须与本地的MinGW(-w64)工具一起使用,它不是Cygwin,你不能轻易扩展MSYS。

所以"MinGW(-w64)"通常指的是整个Free Windows GNU工具链(本机或运行在Cygwin之上的交叉编译器),尽管严格来说它只是头文件和库。

要使用GCC的c++编译器,我建议您使用我的包(创建32位和64位可执行文件)或mingw-builds。或者,您可以安装Cygwin并使用它的setup.exe来安装MinGW-w64交叉编译器,并从那里使用它,但是如果您不需要为构建脚本提供近乎完美的Unix仿真,我建议不要这样做。

EDIT您可能知道,也可能不知道还有另一种选择,即旧的Interix,它避开了Win32子系统,直接构建在NT内核之上。这以Windows Services for UnixSubsystem for Unix Applications的形式提供(适用于Windows 7和Windows 8以及更早版本的Windows)。此解决方案适用于Windows Pro/Ultimate版本客户,并为您提供最接近本机Unix的支持。哎呀,你甚至可以使用Visual Studio来调试你的Unix软件:)

:这个答案并不假装详尽,它只是想对一个概念提出一个简单的理解,脱离思想上的定义。使用不精确的语言是有意的。所以,操作系统大师们,请不要期待完美的定义。

区别在于POSIX/UNIX和windows的根。

POSIX是一个用于操作系统(包括Shell和实用程序)的编程C接口。

Unix和后来的Linux自己实现了这样的接口,Windows本身没有。它有自己的方式来管理操作系统实体(Win32)。Mac OS也没有。

GCC是提供POSIX接口的系统上常见的编译器套件。

要在Windows上使用它,目前有两种选择:

  • 为windows添加一个库(代码和头),该库将POSIX接口添加到windows(将POSIX调用转换为windows调用)并通过编译它们来移植所有GNU程序(基于Linux的):这就是Cygwin所做的。

  • 重写POSIX程序,使其包含与POSIX-Windows映射相关的所有内容,生成本机Windows可执行文件:这就是MinGW和MSYS的作用。

两种方法各有优缺点。简而言之,在Cygwin中,如果某些东西在POSIX下编译,它就会在Cygwin下编译(至少在理论上)。但结果是一个在windows下运行的类似unix的程序。

在MinGW中,您可以编写本机windows程序(通过调用本机Win32 C接口),但是您不能使用windows中不存在的POSIX功能编译所有内容。最明显的例子是MinGW缺少标准的<thread>接口,<locale>支持有限。