为什么Cygwin和MinGW必要?

时间:2013-04-29 07:29:02

标签: c++ compilation cygwin mingw

我一直在努力了解Cygwin和MinGW究竟是什么,并且发现它非常令人困惑。如果你想用C ++编程,你不需要一个C ++编译器吗?从我所看到的,似乎他们努力在Windows上提供类似Unix的操作系统,但我没有看到它的重要性。我的意思是有一些原因导致C ++无法在Windows上本地编译?我还读到它们包含库,这是因为C ++核心语言不支持很多函数,所以非常常见的库(如math.h)会附带它吗?

2 个答案:

答案 0 :(得分:11)

这个解释一定会在其他地方写下来,但无论如何都要这样......

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

MinGW(-w64)是提供Free(如公共域)Win32标头和库的项目。您可以将其视为Windows SDK(旧版)中标题和库的免费替代品。这些可以与GCC一起使用。项目和其他第三方都为Windows提供了本机GCC版本,根本不需要Cygwin。这些软件包可以被视为“完整”(在MinGW(-w64)完整性的范围内)替代Windows SDK。

请注意,Cygwin还提供了Cygwin到Win32的交叉编译器:它们在Cygwin平台上运行,但生成本机Win32可执行文件。

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

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

要使用GCC的C ++编译器,我建议您使用我的包(创建32-bit64-bit可执行文件)或mingw-builds。或者,您可以安装Cygwin并使用其setup.exe来安装MinGW-w64交叉编译器并从那里使用它,但如果您不需要近乎完美的Unix仿真来构建脚本,我建议不要使用它。 / p>

编辑您可能会或可能不会意识到还有另一种替代方案,即旧的Interix,它可以回避Win32子系统并直接在NT内核之上构建。这是以Windows Services for UnixSubsystem for Unix Applications(适用于Windows 7Windows 8以及older versions of Windows)提供的。此解决方案适用于Windows Pro / Ultimate版本的客户,并为您提供最接近您将获得的本机Unix支持。哎呀,您甚至可以使用Visual Studio调试您的Unix软件:)

答案 1 :(得分:11)

注意:这个答案并不是假装详尽无遗,它只是想从意识形态定义中对概念进行简单的理解。使用不精确的语言是有意的。所以操作系统大师,请不要指望完美的定义。

差别在于POSIX / UNIX和Windows的根源。

POSIX是操作系统的编程C接口(除了Shell和实用程序之外)。

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

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

要在Windows上使用它,你有 - 这一点 - 两个选择:

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

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

Bot方法有优点和缺点。简而言之,在Cygwin中,如果在POSIX下编译某些东西,它会在Cygwin下编译(至少在理论上)。但结果是在windows下运行的unix外观程序。

在MinGW中,您可以编写本机Windows程序(通过调用本机Win32 C接口),但是您无法编译所有使用Windows中不存在的POSIX功能。最明显的情况是缺少MinGW的标准<thread>界面和有限的<locale>支持。