为什么Cygwin和MinGW必要?

Cel*_*tas 18 c++ cygwin mingw compilation

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

rub*_*nvb 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.这些包可以被视为Windows SDK的"完整"(在MinGW(-w64)完整性的范围内)替代.

请注意,Cygwin还提供了Cygwin到Win32的交叉编译器:它们在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仿真来构建脚本,我建议不要使用它.

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

  • @Celeritas `fork` 不是 C 标准库的一部分。这是一个 POSIX 函数。MSVC 有一个 C89 标准库,MinGW(-w64) 有一个(接近)C99 标准库。所有这些都是严格的 C,而不是 C++。C++11 确实引用了 C99,因此原则上所有 C99 功能都可以在 C++ 中使用,但这当然不包括 POSIX 内容,例如 `fork` 和 pthreads。 (2认同)

Emi*_*lia 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功能.最明显的情况是缺少<thread>MinGW 的标准接口和有限的<locale>支持.

  • @Celeritas:确切地说.POSIX将操作系统作为一组可调用的C函数呈现给托管程序.请注意,Windows执行相同操作,但使用另一组功能. (4认同)
  • @rubenvb:感谢您的编辑。关于不正确性,如果正确需要如此多的案例和子案例,则存在将 OP 从“高级”答案的真实意图上分心的风险,从而使其对其自身的范围毫无用处。我们可以就这个主题写一整本书,但这远不是 OP 的意图,他只是想要一种简单有效的方法来识别这两件事。您的职位是合法的,但很容易超出范围。 (2认同)