ChatGPT解决这个技术问题 Extra ChatGPT

Cygwin 和 MinGW 有什么区别?

我想让我的 C++ 项目跨平台,我正在考虑使用 Cygwin/MinGW。但是它们之间有什么区别?

另一个问题是我是否能够在没有 Cygwin/MinGW 的系统上运行二进制文件?

您可以进行设置,以便 MinGW 与您的软件包一起安装。虽然我不能为此提供一个可接受的工作流程(因此没有答案..也许其他人可以添加),但我相信这是非常可能的,因为 git 为 git bash 执行此操作。查看任何 Windows 系统上 git bash 的窗口名称。

t
thomasrutter

作为简化,它是这样的:

在 Cygwin 中编译一些东西,你正在为 Cygwin 编译它。

在 MinGW 中编译一些东西,你正在为 Windows 编译它。

关于 Cygwin

Cygwin 是一个兼容层,通过模拟基于 Unix 的操作系统提供的许多基本接口,例如管道、Unix 样式的文件和目录访问等,可以轻松地将简单的基于 Unix 的应用程序移植到 Windows。由 POSIX 标准记录。如果您有使用这些接口的现有源代码,您可以在进行很少甚至没有更改后编译它以与 Cygwin 一起使用,从而大大简化了移植简单的基于 IO 的 Unix 代码以在 Windows 上使用的过程。

当您分发您的软件时,接收者需要将它与 Cygwin 运行时环境(由文件 cygwin1.dll 提供)一起运行。您可以将其与您的软件一起分发,但您的软件必须遵守其开源许可证。即使只是将您的软件与其链接,但单独分发 dll,仍然可以对您的代码施加许可证限制。

关于明威

MinGW 旨在简单地成为 GNU 的 Windows 开发工具的一个端口。它不尝试模拟或提供与 Unix 的全面兼容性,而是提供可在 Windows 中本地使用的 GNU Compiler Collection、GNU Binutils 和 GNU Debugger 版本。它还包括允许在代码中使用 Windows 原生 API 的头文件。

因此,您的应用程序需要使用 Windows API 专门针对 Windows 进行编程,如果创建它以依赖于在标准 Unix 环境中运行并使用 Unix 特定功能,这可能意味着重大改变。默认情况下,在 MinGW 的 GCC 中编译的代码将编译为本机 Windows X86 目标,包括 .exe 和 .dll 文件,尽管您也可以使用正确的设置进行交叉编译,因为您基本上使用的是 GNU 编译器工具套件。

MinGW 是在 Windows 上使用 Microsoft Visual C++ 编译器及其相关链接/制作工具的免费开源替代方案。在某些情况下,可以使用 MinGW 编译旨在使用 Microsoft Visual C++ 编译的内容,而无需进行太多修改。

尽管 MingW 包含一些头文件和接口代码,允许您的代码与 Windows API 交互,但与常规标准库一样,这不会对您创建的软件施加许可限制。

其他注意事项

对于任何重要的软件应用程序,例如使用图形界面、多媒体或访问系统上的设备的应用程序,您离开了 Cygwin 可以为您做的事情的界限,需要进一步的工作来使您的代码跨平台。但是,可以通过使用跨平台工具包或框架来简化此任务,这些工具包或框架允许编码一次并为任何平台成功编译您的代码。如果您从一开始就使用这样的框架,您不仅可以减少移植到另一个平台时的麻烦,而且您可以在所有平台上使用相同的图形小部件——窗口、菜单和控件——如果你正在编写一个GUI 应用程序,并让它们对用户来说是原生的。

例如,开源 Qt framework 是一种流行且全面的跨平台开发框架,允许构建跨操作系统(包括 Windows)工作的图形应用程序。还有其他这样的框架。除了大型框架之外,还有数千个更专业的软件库,它们支持多个平台,让您不必担心为不同平台编写不同的代码。

当您从一开始就开发跨平台软件时,通常没有任何理由使用 Cygwin。在 Windows 上编译时,您通常的目标是使您的代码能够使用 MingW 或 Microsoft Visual C/C++ 进行编译,或两者兼而有之。在 Linux/*nix 上编译时,您通常会直接使用 GNU 编译器和工具对其进行编译。


MinGW 附带的 bash 不是原生的 Windows 程序。它依赖于 MSYS DLL,它是 Cygwin DLL 的一个分支。 MinGW/MSYS 附带的许多其他 Unix 实用程序也是如此。 MinGW gcc 确实是一个本地程序。 Make 在本机版本和 MSYS 版本中都可用。
在速度方面有什么不同吗?
在大多数情况下,速度差异是可以忽略的。任何差异都将归结为 cygwin 兼容层提供的额外抽象级别在多大程度上减慢了速度。它可能对 I/O 之类的事情产生可衡量的影响。例如,很久以前,Git 只能在 cygwin 中的 Windows 上运行,因此速度要慢一些。再说一次,如果您使用框架进行编码,那也是一个抽象层,无论如何都有可能减慢某些事情的速度。
我应该注意,为 cygwin 编译的代码仍然是本机代码——它不需要像 Java 这样的解释器运行。只是当它需要与某些操作系统功能(如磁盘/文件)交互时,它会通过另一层。
通常您无法进行比较,因为您必须根据是否用于 cygwin 来编写不同的代码。尽管对于像“hello world”这样的任何小型、简单的软件,cygwin 等价物只会因为 cygwin 运行时库而更大。如果您不计算 cygwin 运行时库的大小,则 cygwin 版本通常会更小,但我认为这是一个错误的数字,因为该库实际上总是需要与软件一起提供。也就是说,如果您使用任何重要的库/框架,那么它将更多地依赖于此。
C
Cole Tobin

Cygwin 试图在 Windows 上创建一个完整的 UNIX/POSIX 环境。为此,它使用各种 DLL。虽然 GPLv3+ 涵盖了这些 DLL,但它们的许可证包含 an exception,这并不强制 GPLv3+ 涵盖派生作品。 MinGW 是一个 C/C++ 编译器套件,它允许您在不依赖此类 DLL 的情况下创建 Windows 可执行文件 - 您只需要正常的 MSVC 运行时,它们是任何正常的 Microsoft Windows 安装的一部分。

您还可以获得一个类似 UNIX/POSIX 的小型环境,使用名为 MSYS 的 MinGW 编译。它不具备 Cygwin 的所有功能,但非常适合想要使用 MinGW 的程序员。


但是如果我想发布免费的非 GPL 软件呢?抱歉,我不是 GPL 粉丝,仅此而已。
@Dan 您不需要重新分配 MinGW 使用的运行时 - 它是 Windows 的一部分。
@ak2:这是真的,但具有误导性。 cygwyn gcc + cygwin 环境默认生成链接到 (GPL) cygwin dll 的二进制文件。 mingw + msys 默认生成链接到平台 C 库的二进制文件。
@DanMoulding 如果您不是 Microsoft 粉丝,那么您将不得不首先忽略那些为 Windows 开发的感受。 ;-)
@anon“但是如果我想发布免费的非 GPL 软件?”.. cygwin 在其许可条款中有一个特殊例外,允许您在其他(非 GPL)开源许可下分发与其链接的免费软件。请参阅此处的“开源许可例外”:cygwin.com/licensing.html
R
Ray Hulha

为了添加其他答案,Cygwin 附带了 MinGW 库和头文件,您可以通过使用 -mno-cygwin 标志和 gcc 来编译而不链接到 cygwin1.dll。我非常喜欢使用普通的 MinGW 和 MSYS。


这不再适用于 cygwin 1.7.6。 gcc:-mno-cygwin 标志已被删除;使用面向 mingw 的交叉编译器。
@sigjuice:是的,但旧的 -mno-cygwin 标志仍然适用于 GCC 3.x:gcc-3 -mno-cygwin
那么这是否意味着我需要从 mingw 的官方站点下载 mingw 库才能从 cygwin 主机编译为 mingw 目标?或者这些库可以从 Cygwin 的包系统中下载吗?
@CMCDragonkai 您可以通过运行设置实用程序并找到并勾选它们,从 Cygwin 站点获取 mingw 兼容的编译器。因此,即使 gcc 不再生成与 mingw 兼容的代码,您也可以在 Cygwin 中运行“mingw-gcc”(这不是全名)来生成与 mingw 编译器在 msys 下相同的可执行文件。
为了修改 cardiff 的有用回复,Cygwin 的 MinGW 包和命令的名称有些晦涩。要安装 MinGW-64(现在几乎是您一直想要的),请安装 mingw64-x86_64-gcc-core Cygwin 软件包。 MinGW-64 将作为尴尬命名的 x86_64-w64-mingw32-gcc 命令提供。 拜托各位大神,已经有人把这些该死的东西的名字统一起来了。
S
Skilldrick

Wikipedia 进行了比较 here

来自 Cygwin 的 website

Cygwin 是一个类似 Linux 的 Windows 环境。它由两部分组成: 一个 DLL (cygwin1.dll),它充当 Linux API 仿真层,提供大量 Linux API 功能。一组提供 Linux 外观的工具。

来自 Mingw 的 website

MinGW(“Minimalistic GNU for Windows”)是一组可免费使用和可免费分发的 Windows 特定头文件和导入库,并结合 GNU 工具集,允许生成不依赖任何第 3 方 C 运行时 DLL 的本机 Windows 程序


MinGW-w64 网站是 now。正如它所说“Mingw-w64 是原始 mingw.org 项目的进步,创建是为了支持 Windows 系统上的 GCC 编译器。它在 2007 年分叉了它,以提供对 64 位和新 API 的支持。从那时起得到了广泛的使用和传播。
M
Michael Burr

Cygwin 使用 DLL、cygwin.dll(或者可能是一组 DLL)在 Windows 上提供类似 POSIX 的运行时。

MinGW 编译为本机 Win32 应用程序。

如果您使用 Cygwin 构建某些东西,那么您安装它的任何系统也都需要 Cygwin DLL。 MinGW 应用程序不需要任何特殊的运行时。


A
Amir Saniyan

阅读这些已回答的问题以了解 Cygwin 和 MinGW 之间的区别。

问题#1:我想创建一个应用程序,我编写一次源代码、编译一次并在任何平台(例如Windows、Linux 和Mac OS X ......)上运行它。

答案 #1:用 JAVA 编写源代码。一次编译源代码并在任何地方运行它。

问题#2:我想创建一个我编写一次源代码的应用程序,但是我为任何平台(例如Windows、Linux 和Mac OS X ...)单独编译源代码是没有问题的。

答案 #2:用 C 或 C++ 编写源代码。仅使用标准头文件。为任何平台使用合适的编译器(例如,适用于 Windows 的 Visual Studio、适用于 Linux 的 GCC 和适用于 Mac 的 XCode)。请注意,您不应使用任何高级编程功能在所有平台上成功编译源代码。如果您不使用 C 或 C++ 标准类或函数,则您的源代码无法在其他平台上编译。

问题#3:在回答问题#2 时,很难为每个平台使用不同的编译器,是否有任何跨平台编译器?

答案 #3:是的,使用 GCC 编译器。它是一个跨平台编译器。要在 Windows 中编译您的源代码,请使用 MinGW,它为 Windows 提供 GCC 编译器并将您的源代码编译为本地 Windows 程序。不要使用任何高级编程功能(如 Windows API)在所有平台上成功编译您的源代码。如果您使用 Windows API 函数,您的源代码不会在其他平台上编译。

问题 #4:C 或 C++ 标准头文件不提供任何高级编程功能,如多线程。我能做些什么?

答案 #4:您应该使用 POSIX(便携式操作系统接口 [for UNIX])标准。它提供了许多高级编程功能和工具。许多操作系统完全或部分兼容 POSIX(如 Mac OS X、Solaris、BSD/OS 和...)。一些操作系统虽然没有被官方认证为兼容 POSIX,但在很大程度上符合(如 Linux、FreeBSD、OpenSolaris 和...)。 Cygwin 为 Microsoft Windows 提供了一个很大程度上符合 POSIX 标准的开发和运行时环境。

因此:

要在 Windows 中使用 GCC 跨平台编译器,请使用 MinGW。

要在 Windows 中使用 POSIX 标准高级编程功能和工具,请使用 Cygwin。


关于您的小常见问题解答:1)您的权利,如果您需要可以在任何地方运行且不需要编译的东西,请选择 java 之类的东西(也不要忘记 python、perl、ruby 和其他脚本语言)2)这对于 C 的情况有些错误,因为 C 的所有编译器都很好地支持它。 3)你仍然可以使用win32 api,但是你必须将它包装在一个可移植层中,所以这只是一个设计问题。
4)这是完全错误的,因为我上面给出的原因,因为POSIX只是其他api,而且如果你捍卫了这么多POSIX,你应该知道即使Unices也不需要实现同一套POSIX,那么如何你处理吗?想到了实时 POSIX api。这让你的结论完全是虚假和错误的,因为你不需要 POSIX 来处理 Windows 中的任何东西,你可以只使用 Win32 API。或者您认为 Qt 、 GTK 和 WxWidgets 是如何找到跨平台的方法的,我猜他们都必须在 windows 中使用 cygwin。 -1 投票给你的答案。
我不明白你的论点,@ Coyote21。你是说POSIX不适合跨平台开发?您是说用 C/C++ 为多个平台编写代码的唯一合适方法是为您希望支持的每个平台编写自己的兼容层吗?我认为从 POSIX 开始的建议没有任何问题。您确实需要了解它可以让您走多远,以及是否需要广泛的兼容层解决方案。大型兼容层不是常态。否则就是认为 POSIX 是一个彻底的失败。
“您不应该使用任何高级编程功能在所有平台上成功编译您的源代码。”您确实需要澄清“高级编程功能”的含义。根据后面的说法,我的猜测是您实际上是指特定于平台的功能。如果您的意思是现代语言功能,那么不,因为“所有 [主要] 平台”都存在合格的编译器,我们不应该仅仅为了支持那些编译器或库仍然落后的功能而剥夺自己的功能。有了一个体面的编译器、标准的 C/++ 和跨平台库,我们可以非常先进。
被否决,因为这与原始问题几乎没有关系。最好从“因此...”声明开始,并为需要它的人提供常见问题解答作为上下文。推广 Java 无济于事;问题作者没有问使用什么语言。
K
Kaz

从移植 C 程序的角度来看,理解这一点的一个好方法是举一个例子:

#include <sys/stat.h>
#include <stdlib.h>

int main(void)
{
   struct stat stbuf;
   stat("c:foo.txt", &stbuf);
   system("command");
   printf("Hello, World\n");
   return 0;
}

如果我们将 stat 更改为 _stat,我们可以用 Microsoft Visual C 编译这个程序。我们也可以用 MinGW 和 Cygwin 编译这个程序。

在 Microsoft Visual C 下,程序将链接到 MSVC 可再发行运行时库:mxvcrtnn.dll,其中 nn 是某个版本后缀。要发布这个程序,我们必须包含那个 DLL。该 DLL 提供 _statsystemprintf。 (我们还可以选择静态链接运行时。)

在 MinGW 下,该程序将链接到 msvcrt.dll,这是一个内部的、未记录的、未版本化的库,它是 Windows 的一部分,并且禁止应用程序使用。该库本质上是来自 MS Visual C 的可再发行运行时库的一个分支,供 Windows 本身使用。

在这两种情况下,程序都会有类似的行为:

stat 函数将返回非常有限的信息——例如,没有有用的权限或 inode 号。

路径 c:file.txt 根据与驱动器 c: 关联的当前工作目录解析。

系统使用 cmd.exe /c 来运行外部命令。

我们也可以在 Cygwin 下编译程序。与 MS Visual C 使用的可再发行运行时类似,Cygwin 程序将链接到 Cygwin 的运行时库:cygwin1.dll(Cygwin 专有)和 cyggcc_s-1.dll(GCC 运行时支持)。由于 Cygwin 现在在 LGPL 下,我们可以与我们的程序一起打包,即使它不是与 GPL 兼容的自由软件,并发布程序。

在 Cygwin 下,库函数的行为会有所不同:

stat 函数具有丰富的功能,可以在大多数字段中返回有意义的值。

路径 c:file.txt 根本不被理解为包含驱动器号引用,因为 c: 后面没有斜杠。冒号被认为是名称的一部分,并以某种方式被破坏了。 Cygwin 中没有针对卷或驱动器的相对路径的概念,没有“当前记录的驱动器”概念,也没有每个驱动器的当前工作目录。

系统函数尝试使用 /bin/sh -c 解释器。 Cygwin 将根据您的可执行文件的位置解析 / 路径,并期望 sh.exe 程序与您的可执行文件位于同一位置。

Cygwin 和 MinGW 都允许您使用 Win32 函数。如果您想调用 MessageBoxCreateProcess,您可以这样做。您还可以在 MinGW 和 Cygwin 下使用 gcc -mwindows 轻松构建不需要控制台窗口的程序。

Cygwin 不是严格意义上的 POSIX。除了提供对 Windows API 的访问之外,它还提供自己的一些 Microsoft C 函数的实现(在 msvcrt.dll 或可重新分发的 msvcrtnn.dll 运行时中找到的东西)。这方面的一个例子是 spawn* 系列函数,如 spawnvp。在 Cygwin 上使用这些代替 forkexec 是一个好主意,因为它们更好地映射到没有 fork 概念的 Windows 进程创建模型。

因此:

Cygwin 程序与 MS Visual C 程序一样“原生”,因为它需要库的伴奏。 Windows 上的编程语言实现有望提供自己的运行时,甚至 C 语言实现。 Windows 上没有供公众使用的“libc”。

MinGW 不需要第三方 DLL 的事实实际上是一个劣势;它依赖于 Visual C 运行时的未记录的、Windows 内部的分支。 MinGW 这样做是因为 GPL 系统库异常适用于 msvcrt.dll,这意味着可以使用 MinGW 编译和重新分发 GPL 版本的程序。

由于与 msvcrt.dll 相比,它对 POSIX 的支持更广泛、更深入,因此 Cygwin 是迄今为止移植 POSIX 程序的优越环境。由于它现在属于 LGPL,它允许重新分发具有各种许可证(开源或闭源)的应用程序。 Cygwin 甚至包含与 Microsoft 控制台一起使用的 VT100 仿真和 termios!使用 tcsetattr 设置原始模式并使用 VT100 代码控制光标的 POSIX 应用程序将在 cmd.exe 窗口中正常工作。就最终用户而言,它是一个本机控制台应用程序,通过 Win32 调用来控制控制台。

然而:

作为一个原生的 Windows 开发工具,Cygwin 有一些怪癖,比如路径处理对 Windows 来说是陌生的,依赖于一些硬编码的路径,如 /bin/sh 和其他问题。这些差异使 Cygwin 程序“非本地”。如果程序将路径作为参数或从对话框输入,Windows 用户希望该路径与其他 Windows 程序中的工作方式相同。如果它不能那样工作,那就有问题了。

插件:在 LGPL 发布后不久,我启动了 Cygnal(Cygwin 本地应用程序库)项目,以提供旨在解决这些问题的 Cygwin DLL 的分支。程序可以在 Cygwin 下开发,然后使用 Cygnal 版本的 cygwin1.dll 进行部署,无需重新编译。随着这个库的改进,它将逐渐消除对 MinGW 的需求。

当 Cygnal 解决了路径处理问题时,将可以开发一个可执行文件,该可执行文件在作为 Windows 应用程序与 Cygnal 一起发布时与 Windows 路径一起使用,并且在安装在 Cygwin 下的 /usr/bin 中时与 Cygwin 路径无缝协作。在 Cygwin 下,可执行文件将透明地使用 /cygdrive/c/Users/bob 之类的路径。在与 Cygnal 版本的 cygwin1.dll 链接的本机部署中,该路径将毫无意义,但它会理解 c:foo.txt


优秀的答案。显示在 3 个环境中的每一个环境中编译、链接和执行同一段代码时会发生什么是关键并阐明了差异。
@Kaz 开发进展如何?听起来很有趣,但至少一年前它似乎已经死了。为什么不使用 GitHub,以便人们可以帮助和参与?
@not2qubit 我觉得当我的项目托管在我自己控制的服务器上时,我可以更好地控制它们。我正在使用 git;可以拉取存储库。我可以通过电子邮件接受拉取请求(正如 Linus Torvalds 设计的那样)。我还可以为成为维护者级别贡献者的人提供一个具有提交权限的帐户。 Cygnal 工作正常;我经常将它捆绑在 TXR 语言新版本的 Windows 版本中。我将在 2019 年初的某个时候将 Cygnal 重新设置为更新的 Cygwin 基线。
@not2qubit 请注意,Cygnal 议程中的所有 17 个问题均已解决。没有人提出任何新的要求,也没有人抱怨这 17 项的处理方式。所以除了重新定位到更新的 Cygwin 之外,不需要任何开发,这并不是非常紧迫。
s
smwikipedia

其他答案已经达到目标。我只想添加一个插图以便快速了解。

https://i.stack.imgur.com/RFhqo.png


4
4 revs, 3 users 81%

Wikipedia Says

MinGW 从 Cygwin 的 1.3.3 版分叉。尽管 Cygwin 和 MinGW 都可用于将 UNIX 软件移植到 Windows,但它们有不同的方法:Cygwin 旨在提供一个完整的 POSIX 层,该层提供对 Linux、UNIX 和 BSD 变体上存在的多个系统调用和库的模拟。 POSIX 层在 Windows 之上运行,在必要时牺牲了性能以实现兼容性。因此,这种方法需要使用 Cygwin 编写的 Windows 程序在必须与程序一起分发的 copyleft 兼容库之上运行,以及程序的源代码。 MinGW 旨在通过直接 Windows API 调用提供本机功能和性能。与 Cygwin 不同,MinGW 不需要兼容层 DLL,因此程序不需要与源代码一起分发。因为 MinGW 依赖于 Windows API 调用,它不能提供完整的 POSIX API;它无法编译一些可以用 Cygwin 编译的 UNIX 应用程序。具体来说,这适用于需要诸如 fork()、mmap() 或 ioctl() 等 POSIX 功能的应用程序以及那些希望在 POSIX 环境中运行的应用程序。使用本身已移植到 MinGW 的跨平台库编写的应用程序,例如 SDL、wxWidgets、Qt 或 GTK+,通常在 MinGW 中编译就像在 Cygwin 中一样容易。 MinGW 和 MSYS 的组合提供了一个小型、独立的环境,可以将其加载到可移动媒体上,而无需在注册表中留下条目或在计算机上留下文件。 Cygwin Portable 提供了类似的功能。通过提供更多功能,Cygwin 的安装和维护变得更加复杂。也可以在 POSIX 系统下使用 MinGW-GCC 交叉编译 Windows 应用程序。这意味着开发人员不需要安装带有 MSYS 的 Windows 来编译将在没有 Cygwin 的情况下在 Windows 上运行的软件。


绝对不是 “安装和维护更复杂”!使用 apt-cyg 因为它可能比在 WSL 下使用 apt 更容易。
S
Simon Sobisch

不要忽视 AT&T 的 U/Win 软件,该软件旨在帮助您在 Windows 上编译 Unix 应用程序(最新版本 - 2012-08-06;使用 Eclipse Public License,版本 1.0)。

像 Cygwin 一样,它们必须与库竞争。在他们的情况下POSIX.DLL。 AT&T 的家伙是了不起的工程师(为您带来 ksh 和 dot 的同一组),他们的东西值得一试。


哇,这些都是一些糟糕的网页。我终于在 www2.research.att.com/sw/download 找到了下载链接,但没有关于该项目的在线文档或信息。
虽然这些信息很有用,但我觉得这可能是关于 MingW 或 Cygwin 替代品的问题的答案,而不是这个问题。
A
Akib Azmain

要在非自由/专有/闭源应用程序中使用 Cygwin,您需要花费数万美元购买 Red Hat 的“license buyout”;这以相当大的代价使 standard licensing terms 无效。谷歌“cygwin license cost”并查看前几个结果。

对于 mingw,不会产生这样的成本,并且许可证(PD、BSD、MIT)非常宽松。您最多可能需要在您的应用程序中提供许可证详细信息,例如使用 mingw64-tdm 时所需的 winpthreads 许可证。

感谢 Izzy Helianthus 编辑:商业许可证不再可用或不再需要,因为在 LGPL 下的 Cygwin is now being distributed 的 winsup 子目录中找到的 API 库,而不是完整的 GPL。


Redhat 网站的更新(来自“许可买断”的链接 - '截至 2016 年 3 月 1 日,Red Hat 不再销售 Cygwin 的商业买断许可。商业许可不再需要,因为 Cygwin 现在是在 GNU Lesser 下分发的GPL (LGPL)。' > 来自 Cygwin 网站。在源代码的 winsup 子目录中找到的 Cygwin™ API 库包含在 GNU Lesser General Public License (LGPL) 版本 3 或更高版本中。有关 LGPLv3 要求的详细信息,请阅读 GNU 宽通用公共许可证 (LGPL)。
v
vartec

Cygwin 模拟整个 POSIX 环境,而 MinGW 是仅用于编译的最小工具集(编译本机 Win 应用程序。)因此,如果您想让您的项目跨平台,两者之间的选择是显而易见的,MinGW。

尽管您可能会考虑在 Windows 上使用 VS,在 Linux/Unices 上使用 GCC。大多数开源项目都是这样做的(例如 Firefox 或 Python)。


“大多数”在这里似乎是一个毫无意义的黄鼠狼词,尤其是只有 2 个示例且没有统计数据。许多 FOSS 项目将 VS 项目文件作为一种象征性的手势,我怀疑它更准确。但是,如果可以参考过去的经验,那么 GCC 或 Clang 通常更安全,因为随着语言标准的发展,VS 往往会大大落后。
这是 2009 年的答案。如今,GCC 的情况看起来更加黯淡。至于“大多数”,如果按影响来衡量,那么仅 Firefox 和 Chrome 的用户就比其他任何东西都多。
自从我回答之后发生了变化,现在 clang 是一个可行的跨平台解决方案。
获得 2021 年版的“自那以后发生了什么变化”真是太棒了。
佚名

请注意,实用程序行为可能在两者之间真正有所不同。

例如,Cygwin tar 可以分叉——因为 DLL 支持 fork()——而 mingw 版本不能。这是尝试从源代码编译 mysql 时出现的问题。


这就是为什么完全成熟的支持 MinGW 的环境,例如 MSYS2,为构建期间所需的工具链的低级螺母和螺栓提供 Cygwin 或其他完全 POSIX 兼容的层。然后实际的编译和链接留给完全原生的 MinGW 编译器。 MSYS2 真的很整洁。
b
bwDraco

Cygwin 旨在为 Windows 提供或多或少完整的 POSIX 环境,包括旨在提供成熟的类 Linux 平台的广泛工具集。相比之下,MinGW 和 MSYS 提供了一个轻量级、极简的类似 POSIX 的层,只有 gccbash 等更重要的工具可用。由于 MinGW 更简约的方法,它不提供 Cygwin 提供的 POSIX API 覆盖程度,因此无法构建某些可以在 Cygwin 上编译的程序。

就两者生成的代码而言,Cygwin 工具链依赖于动态链接到大型运行时库 cygwin1.dll,而 MinGW 工具链将代码编译为动态链接到 Windows 原生 C 库 msvcrt.dll 的二进制文件以及静态到 glibc 的部分。因此,Cygwin 可执行文件更紧凑,但需要单独的可再发行 DLL,而 MinGW 二进制文件可以独立发布,但往往更大。

基于 Cygwin 的程序需要单独的 DLL 才能运行这一事实也导致了许可限制。 Cygwin 运行时库在 GPLv3 下获得许可,对于具有 OSI 兼容许可证的应用程序有一个链接例外,因此希望围绕 Cygwin 构建闭源应用程序的开发人员必须从 Red Hat 获得商业许可证。另一方面,MinGW 代码可以在开源和闭源应用程序中使用,因为标头和库是许可许可的。


M
Mamun

Cygwin 使用兼容层,而 MinGW 是原生的。这是主要区别之一。


A
Akib Azmain
   MinGW (or MinGW-w64)               Cygwin
   --------------------               ------

   Your program written        Your program written
  for Unix and GNU/Linux      for Unix and GNU/Linux

             |                           |
             |                           |
             V                           V

    Heavy modifications       Almost no modifications

             |                           |
             |                           |
             V                           V

        Compilation                 Compilation
Program compiled with Cygwin ---> Compatibility layer ---> Windows API

Program compiled with MinGW (or MingGW-w64) -------------> Windows API

上面的图表主要与为基于命令行/控制台的输入和输出而设计的程序相关,并且随着您添加更复杂的设备访问或图形用户界面而逐渐变得不那么真实,其中 cygwin 兼容层对您的帮助相对较少。
g
gimel

Cygwin 是用于 Microsoft Windows 的类 Unix 环境和命令行界面。

Mingw 是 GNU 编译器集合 (GCC) 到 Microsoft Windows 的本机软件端口,以及一组可免费分发的导入库和用于 Windows API 的头文件。 MinGW 允许开发人员创建本地 Microsoft Windows 应用程序。

您可以在没有 cygwin 环境的情况下运行使用 mingw 生成的二进制文件,前提是所有必要的库 (DLL) 都存在。