19

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

4

2 回答 2

12

这个解释肯定已经写在别处了,但无论如何……

Cygwin 是基于 Win32 API 构建的 POSIX 兼容运行时。它提供了一个很大程度上兼容 POSIX C 库,并且围绕它,有一种带有包管理器的“Cygwin Distro”,允许您安装大量移植到在 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 Toolchain(本机或在 Cygwin 之上运行的交叉编译器),尽管严格来说它只是头文件和库。

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

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

于 2013-04-29T07:36:51.007 回答
12

注意:这个答案并不假装是详尽无遗的,它只是想表达对一个概念的简单理解,而不是意识形态定义。使用不精确的语言是故意的。所以操作系统专家,请不要指望完美的定义。

区别在于 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 的意义所在。

机器人方法有优点和缺点。简而言之,在 Cygwin 中,如果某些东西在 POSIX 下编译,它就会在 Cygwin 下编译(至少在理论上)。但结果是一个在 Windows 下运行的类 Unix 程序。

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

于 2013-04-29T08:31:01.330 回答