Cygwin和MinGW有什么区别?

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

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

395364 次浏览

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

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

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

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

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

维基百科做了一个比较这里

来自Cygwin的网站

  • Cygwin是Windows的Linux环境,它由两部分组成:DLL(cygwin1.dll),它充当LinuxAPI仿真层,提供大量LinuxAPI功能。
  • 提供Linux外观和感觉的工具集合。

订阅关于网站的评论:

MinGW(“Windows的简约GNU”)是一个免费可用和可自由分发的Windows特定头文件和导入库的集合,结合GNU工具集,允许人们生成不依赖任何第三方C运行时DLL的本机Windows程序

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

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

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

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

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

请注意,效用行为在两者之间确实有所不同。

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

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

就像Cygwin一样,他们必须与图书馆竞争;在他们的案例中POSIX.DLL。AT&T的人是很棒的工程师(带给你ksh和的同一组),他们的东西值得一看。

作为简化,它是这样的:

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

  • 在MinGW中编译一些东西,你正在编译它for windows

什么是Cygwin?

Cygwin是一个兼容层,通过模拟基于Unix的操作系统提供的许多基本接口,例如管道、Unix样式的文件和目录访问等,可以轻松地将简单的基于Unix的应用程序移植到Windows。Cygwin还与GNU编译器集合的端口和一些其他工具捆绑到Cygwin环境。

如果您有使用POSIX接口的现有源代码,则可以在进行很少甚至没有更改后编译它以用于Cygwin,从而大大简化了移植简单的基于IO的Unix代码以在Windows上使用的过程。

Cygwin的缺点

使用Cygwin编译需要将您的程序与Cygwin运行时环境链接,Cygwin运行时环境通常会作为动态链接库cygwin1.dll与您的程序一起分发。该库是开源的,需要使用它的软件共享兼容的开源许可证,即使您单独分发dll,因为头文件和接口都包含在内。因此,这对您如何许可代码施加了一些限制。

什么是MinGW?

MinGW是用于本机Windows的GNU编译器工具的发行版,包括GNU编译器集合、GNU Binutils和GNU调试器。还包括允许开发本机Windows应用程序的头文件和库。因此,这将作为Microsoft VisualC++套件的开源替代品。

可以使用MinGW编译最初打算使用Microsoft VisualC++编译的内容,只需进行相对较小的修改。

默认情况下,在MinGW的GCC中编译的代码将编译为本机Windows目标,包括. exe和. dll文件,尽管您也可以使用正确的设置进行交叉编译,因为您基本上使用的是GNU编译器工具套件。

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

MinGW的缺点

使用MinGW为Windows编译的软件必须使用Windows自己的API进行文件和IO访问。如果您要将Unix/Linux应用程序移植到Windows,这可能意味着对代码进行重大更改,因为POSIX类型API不能再使用。

其他考虑

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

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

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

为了补充其他答案,Cygwin附带了MinGW库和标头,您可以通过使用带有gcc的-mno-cygwin标志来编译而无需链接到cygwin1.dll。

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


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

答案#1:将源代码写入 JAVA。编译源代码一次,然后 在任何地方运行它。


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

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


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

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


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

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


因此:

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

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

维基百科说

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

因为MinGW依赖于Windows API calls,所以它不能 提供完整的POSIX API;它无法编译一些可以使用Cygwin编译的UNIX applications。具体来说,这 适用于需要POSIX功能的应用程序,例如 fork()mmap()ioctl()以及那些期望在 POSIX environment。使用本身已移植到MinGWcross-platform library编写的应用程序,例如SDLwxWidgetsQtGTK+通常会在 MinGW就像在Cygwin中一样。

MinGWMSYS的组合提供了一个小型的、独立的 无需离开即可加载到可移动媒体上的环境 注册表中的条目或计算机上的文件。Cygwin便携式 提供了类似的功能。通过提供更多功能,Cygwin 安装和维护变得更加复杂。

也可以使用cross-compile Windows applications MinGW-GCC under POSIX systems。这意味着开发人员不 需要安装带有MSYS的Windows才能编译将 在没有CygwinWindows上运行。

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

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

要在非免费/专有/闭源应用程序中使用Cygwin,您需要为Red Hat的“许可控制股权收购”支付数万美元;这以相当大的成本使标准许可条款无效。谷歌“cygwin许可成本”并查看前几个结果。

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

编辑感谢Izzy Helianth:商业许可证不再可用或不需要,因为API库位于LGPL下Cygwin现在正在分发的winsup子目录中,而不是完整的GPL。

从移植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:关联的当前工作目录解析。
  • system使用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中没有针对卷或驱动器的相对路径的概念,没有“当前记录的驱动器”概念,也没有每个驱动器的当前工作目录。
  • system函数尝试使用/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相比,Cygwin对POSIX的支持更加广泛和深入,是迄今为止移植POSIX程序的优越环境。由于它现在属于LGPL,它允许重新分发具有各种许可证的应用程序,无论是开源还是闭源。Cygwin甚至包含VT100仿真和termios,它们与Microsoft控制台一起使用!一个使用tcsetattr设置原始模式并使用VT100代码控制光标的POSIX应用程序将直接在cmd.exe窗口中工作。就最终用户而言,它是一个本机控制台应用程序,可以通过Win32调用来控制控制台。

但是:

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

插头:在LGPL发布后不久,我启动了Cygnal(Cygwin Native Application Library)项目,提供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

其他答案已经命中目标了。我只想添加一个示例,以便快速捕获。

在此处输入图片描述

   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