Cygwin和MinGW有什么区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cygwin和MinGW有什么区别?相关的知识,希望对你有一定的参考价值。

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

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

答案

作为简化,它是这样的:

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

关于Cygwin

Cygwin的目的是通过模拟基于Unix的操作系统提供的许多小细节,并通过POSIX标准记录,使基于Unix的应用程序更容易移植到Windows。您的应用程序可以使用Unix功能,例如管道,Unix风格的文件和目录访问等等,它可以使用Cygwin进行编译,Cygwin将充当应用程序的兼容层,因此许多特定于Unix的范例都可以继续使用。

分发软件时,收件人需要与Cygwin运行时环境一起运行(由文件cygwin1.dll提供)。您可以将此软件与软件一起分发,但您的软件必须遵守其开源许可证。甚至可能只是将您的软件与其链接,但单独分发dll,可能仍需要您遵守开源许可证。

关于MinGW

MinGW旨在简单地成为GNU编译器工具的Windows端口,例如GCC,Make,Bash等。它不会尝试模拟或提供与Unix的全面兼容性,而是提供在Windows上使用GCC(GNU编译器)和少量其他工具的最低必要环境。它没有像Cygwin那样的Unix仿真层,但结果你的应用程序需要专门编程才能在Windows中运行,如果创建它依赖于在标准Unix环境中运行而且可能意味着重大改变使用特定于Unix的功能,例如前面提到的功能。默认情况下,在MinGW的GCC中编译的代码将编译为本机Windows X86目标,包括.exe和.dll文件,但您也可以使用正确的设置进行交叉编译,因为您基本上使用的是GNU编译器工具套件。

MinGW本质上是Microsoft Visual C++编译器及其相关链接/制作工具的替代品。在某些情况下,可能使用MinGW来编译用于使用Microsoft Visual C ++编译的内容,使用正确的库,在某些情况下还可以进行其他修改。

MinGW包含一些用于与Windows操作系统交互的基本标准库,但与GNU编译器集合中包含的常规标准库一样,这些不会对您创建的软件施加许可限制。

对于非平凡的软件应用程序,除非您使用全面的跨平台框架,否则将它们设置为跨平台可能是一个相当大的挑战。当我写这篇文章时,Qt framework是最受欢迎的用户之一,允许构建可在包括Windows在内的操作系统上运行的图形应用程序,但也有其他选项。如果你从一开始就使用这样的框架,你不仅可以减少在移植到另一个平台时的麻烦,而且如果你正在写一个平台,你可以在所有平台上使用相同的图形小部件 - 窗口,菜单和控件。 GUI应用程序,让它们对用户来说是原生的。

另一答案

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

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

另一答案

要在商业/专有/非开源应用程序中使用Cygwin,您需要为Red Hat的“license buyout”支付数万美元;这使standard licensing terms失去了相当大的成本。谷歌“cygwin许可证费用”,并看到前几个结果。

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

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

另一答案

请注意,实用程序行为可以真正地在两者之间变化。

例如,Cygwin tar可以fork - 因为DLL中支持fork() - mingw版本不支持。尝试从源代码编译mysql时,这是一个问题。

另一答案

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代码可以在开源和闭源应用程序中使用,因为标头和库是许可的。

另一答案

其他答案已达到目标。我只想添加一个快速捕捉的插图。

enter image description here

另一答案

Cygwin是一个类似Unix的环境和Microsoft Windows的命令行界面。

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

如果存在所有必需的库(DLL),则可以在没有mingw环境的情况下运行使用cygwin生成的二进制文件。

另一答案

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

另一答案

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

您还可以获得一个类似于UNIX / POSIX的小型环境,使用MinGW编译,名为MSYS。它没有任何接近Cygwin的所有功能,但对于想要使用MinGW的程序员来说是理想的选择。

另一答案

要添加其他答案,Cygwin附带MinGW库和标题,您可以通过使用-mno-cygwin标志与gcc链接到cygwin1.dll进行编译。我更喜欢使用普通的MinGW和MSYS。

另一答案

维基百科做了比较here

来自Cygwin的website

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

来自Mingw的website

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

另一答案

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

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

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

另一答案

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


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

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


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

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


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

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


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

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


从而:

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

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

另一答案

Wikipedia Says

MinGWCygwin版本1.3.3分叉。尽管CygwinMinGW都可用于将UNIX软件移植到Windows,但它们有不同的方法:Cygwin旨在提供完整的POSIX layer,它提供了LinuxUNIXBSD变体上存在的几个系统调用和库的模拟。 POSIX layerWindows之上运行,在必要时牺牲性能以实现兼容性。因此,这种方法需要使用Windows编写的Cygwin程序在一个copylefted兼容库之上运行,该库必须与程序一起分发,以及程序的source codeMinGW旨在通过直接Windows API calls提供本机功能和性能。与Cygwin不同,MinGW不需要兼容层DLL,因此程序不需要与source code一起分发。

因为MinGW依赖于Windows API calls,它不能提供完整的POSIX API;它无法编译一些可以用UNIX applications编译的Cygwin。具体来说,这适用于需要POSIXfork()mmap()ioctl()

以上是关于Cygwin和MinGW有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

MingW和cygwin的区别(转)

mingw和cygwin区别

Cygwin 和MinGW 的区别与联系是怎样的

mingw和cygwin的区别

mingw和mingw32包含的文件有啥区别,可以混用吗?

mingw-w64和Linux下的GCC有区别吗