windows - Cygwin和MinGW有什么区别?(MinGW从Cygwin 1.3.3版本中分离出来)

windows - Cygwin和MinGW有什么区别?

我想让个人C ++项目跨平台,我正在考虑使用Cygwin / MinGW。 可是他们之间有什么区别呢?html

另外一个问题是,若是没有Cygwin / MinGW,我可否在系统上运行二进制文件?node

 Answers


Cygwin是尝试在Windows上建立一个完整的UNIX / POSIX环境。 要作到这一点,它使用各类DLL。 虽然这些DLL被GPLv3 +覆盖,可是它们的许可证包含一个异常 ,不会强制派生的工做被GPLv3 +覆盖。 MinGW是一个C / C ++编译器套件,它容许您建立Windows可执行文件而不依赖于这样的DLL - 您只须要普通的MSVC运行时,这是Microsoft Windows正常安装的一部分。mysql

你也能够获得一个小的UNIX / POSIX环境,用MinGW编译成MSYS 。 它没有Cygwin的全部功能,但对于想要使用MinGW的程序员来讲是很是理想的。ios

做为一个简化,就是这样的:git

  • 在Cygwin中编译一些东西,而后编译Cygwin 。程序员

  • 编译MinGW中的东西,你正在为Windows编译它。github

关于Cygwinsql

Cygwin的目的是经过模拟许多基于Unix的操做系统提供的小细节,并经过POSIX标准来记录,使得基于nix的应用程序更容易移植到Windows上。 若是您的应用程序假定它可使用Unix功能,例如管道,Unix风格的文件和目录访问等等,那么您能够在Cygwin中编译它,而Cygwin自己将做为您的应用程序的兼容层 ,这些特定于Unix的范例能够继续使用,对应用程序进行不多或不须要修改。编程

若是你想为Cygwin编译一些东西并分发这个应用程序,那么你还必须将Cygwin运行时环境(由cygwin1.dll提供)与它一块儿cygwin1.dll , 这对你可能使用哪一种类型的软件许可有影响 。windows

关于MinGW

MinGW是GNU编译器工具的Windows端口,例如GCC,Make,Bash等等。 它不会试图模拟或提供与Unix的全面兼容性,而是提供在Windows上使用GCC(GNU编译器)和少许其余工具的最低必要环境。 它没有像Cygwin同样的Unix仿真层,可是结果是你的应用程序须要特别的编程才能在Windows上运行,这可能意味着若是它被建立为依赖于在标准Unix环境中运行,使用Unix特有的功能,好比前面提到的功能。 默认状况下,在MinGW的GCC中编译的代码将编译为本机Windows X86目标,包括.exe和.dll文件,可是也可使用正确的设置进行交叉编译。 MinGW是Microsoft Visual C ++编译器及其关联的连接/制做工具的开源替代品。

存在至关复杂的跨平台框架,这使得将应用轻松移植到各类操做系统的任务成为可能 - 例如Qt框架是跨平台应用的流行框架。 若是您从一开始就使用这样的框架,那么您不只能够减小在移植到其余平台时遇到的麻烦,并且能够在全部平台上使用相同的图形窗口小部件(窗口,菜单和控件) GUI应用程序。

要添加到其余答案,Cygwin附带MinGW库和标题,您能够经过使用-mno-cygwin标志与gcc编译而不连接到cygwin1.dll。 我很是喜欢使用简单的MinGW和MSYS。

维基百科在这里作一个比较。

从Cygwin的网站 :

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

从Mingw的网站 :

MinGW(简称“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 ++写你的源代码。 只使用标准头文件。 为任何平台使用合适的编译器(例如Windows的Visual Studio,Linux的GCC和Mac的XCode)。 请注意,您不该该使用任何高级编程功能在全部平台上成功编译您的源代码。 若是您不使用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。

维基百科说 :

MinGWCygwin 1.3.3版本中分离出来。 虽然CygwinMinGW均可以用来将UNIX软件移植到Windows ,但他们有不一样的方法: Cygwin目标是提供一个完整的POSIX layer ,提供Linux , UNIXBSD变种中存在的几个系统调用和库的模拟。 POSIX layer运行在Windows之上,为了兼容性而牺牲性能。 所以,这种方法须要使用Cygwin编写的Windows程序运行在必须与程序一块儿分发的copylefted兼容性库的顶部,以及程序的source code 。 MinGW旨在经过直接的Windows API calls提供原生的功能和性能。 与Cygwin不一样, MinGW不须要兼容层DLL ,所以程序不须要与source code一块儿分发。

因为MinGW依赖于Windows API calls ,所以没法提供完整的POSIX API ; 它没法编译一些能够用Cygwin编译的UNIX applications 。 具体而言,这适用于须要POSIX功能(如fork() , mmap()ioctl()以及指望在POSIX environment运行的应用程序。 使用自己已经移植到MinGWcross-platform library (例如SDL , wxWidgets , QtGTK+编写的应用程序一般在MinGW编译将像在Cygwin那样容易。

MinGWMSYS的组合提供了一个小型自包含的环境,能够将其加载到可移动媒体上,而无需在注册表或计算机上的文件中留下条目。 Cygwin Portable提供了相似的功能。 经过提供更多的功能, Cygwin安装和维护变得更加复杂。

也能够MinGW-GCC under POSIX systemsMinGW-GCC under POSIX systems cross-compile Windows applications 。 这意味着开发人员不须要使用MSYS进行Windows安装来编译在没有Cygwin状况下在Windows运行的软件。

从移植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提供了_stat , systemprintf 。

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

在这两种状况下,该计划将有相似的行为:

  • stat函数将返回很是有限的信息 - 例如,没有有用的权限或inode编号。
  • 根据与驱动器c:相关联的当前工做目录来解析路径c:file.txt 。
  • system使用cmd.exe /c来运行外部命令。

咱们也能够编译Cygwin下的程序。 相似于MS Visual C使用的可再发行的运行时,Cygwin程序将被连接到Cygwin的运行时库: cygwin1.dll (Cygwin proper)和cyggcc_s-1.dll(GCC运行时支持)。 因为Cygwin如今在LGPL之下,即便它不是GPL兼容的免费软件,咱们也能够用咱们的程序打包,并运行程序。

在Cygwin下,库函数的行为将有所不一样:

  • stat函数具备丰富的功能,在大多数字段中返回有意义的值。
  • 路径c:file.txt彻底不理解为包含驱动器号引用,由于c:后面没有斜杠。 冒号被认为是名字的一部分,并以某种方式破坏了它。 在Cygwin中没有针对卷或驱动器的相对路径的概念,没有“当前记录的驱动器”概念,也没有每一个驱动器当前的工做目录。
  • system函数尝试使用/bin/sh -c解释器。 Cygwin将根据您的可执行文件的位置来解析/路径,并但愿sh.exe程序与您的可执行文件位于sh.exe位置。

Cygwin和MinGW都容许你使用Win32函数。 若是你想调用MessageBoxCreateProcess ,你能够这样作。 你也能够在MinGW和Cygwin下使用gcc -mwindows轻松地建立一个不须要控制台窗口的程序。

Cygwin不是严格的POSIX。 除了提供对Windows API的访问以外,它还提供了一些Microsoft C函数(在msvcrt.dll找到的东西或可从新分发的msvcrtnn.dll运行时)的本身的实现。 一个例子就是spawn*系列的spawn*系列。 这些在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甚至包含VT100仿真和termios ,它们与Microsoft控制台一块儿使用! 使用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一块儿使用时,与Cygwin的/usr/bin下安装Cygwin路径无缝工做与Windows路径。 在Cygwin下,可执行文件将透明地处理/cygdrive/c/Users/bob类的路径。 在Cygnal版本的cygwin1.dll连接的本地部署中,该路径将没有任何意义,而它将理解c:foo.txt 。

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

像Cygwin同样,他们必须跑到一个图书馆。 在他们的状况下POSIX.DLL 。 AT&T的工做人员是很是棒的工程师(一样的团队给你带来了ksh和dot ),他们的东西值得一试。

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

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

请注意,效用行为能够真正在二者之间变化。

例如,Cygwin tar能够fork - 由于fork()在DLL中被支持,而mingw版本则不能。 尝试从源代码编译mysql时,这是一个问题。

要在商业/专有/非开源应用程序中使用Cygwin,您须要从Red Hat得到“ 许可证买断 ”的数万美圆; 这使标准许可条款以至关大的成本无效。 谷歌“cygwin许可证费用”,看到前几个结果。

对于mingw,这样的成本是不会发生的,许可证(PD,BSD,MIT)是很是宽容的。 您至多可能须要为您的应用程序提供许可证详细信息,例如使用mingw64-tdm时所需的winpthreads许可证。

编辑感谢Izzy向日葵:商业许可证再也不是可用的或必要的,由于在Cygwin的winsup子目录中找到的API库如今正在 LGPL下分发 ,而不是完整的GPL。

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是一个相似于Unix的环境和Microsoft Windows的命令行界面。

Mingw是GNU编译器集合(GCC)到Microsoft Windows的原生软件端口,还有一套可自由分发的用于Windows API的导入库和头文件。 MinGW容许开发人员建立本机Microsoft Windows应用程序。

只要全部必要的库(DLL)都存在,您就能够在不使用cygwin环境的状况下运行使用mingw生成的二进制文件。

Cygwin使用兼容性层,而MinGW是本地的。 这是不一样的。

 

https://code.i-harness.com/zh-CN/q/bc6ac

相关文章
相关标签/搜索