当前位置:  开发笔记 > 编程语言 > 正文

Cygwin和MinGW有什么区别?

如何解决《Cygwin和MinGW有什么区别?》经验,为你挑选了14个好方法。

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

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



1> thomasrutter..:

作为简化,它是这样的:

在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框架是最受欢迎的框架之一,允许构建可在包括Windows在内的操作系统上运行的图形应用程序,但也有其他选项.如果你从一开始就使用这样的框架,你不仅可以减少在移植到另一个平台时的麻烦,而且如果你正在写一个平台,你可以在所有平台上使用相同的图形小部件 - 窗口,菜单和控件. GUI应用程序,让它们对用户来说是原生的.


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

2> 小智..:

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

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


但是,如果我想发布免费的非GPL软件?对不起,我不是GPL粉丝,就是这样.
@Dan您不需要重新分配MinGW使用的运行时 - 它是Windows的一部分.
@ ak2:这是真的,但有误导性.cygwyn gcc + cygwin环境默认生成链接到(GPL)cygwin dll的二进制文件.mingw + msys默认生成链接到平台C lib的二进制文件.
@anon"但如果我想发布免费的非GPL软件?".. cygwin在其许可条款中有一个特殊例外,允许您在其他(非GPL)开源许可下分发与之链接的免费软件.请参阅此处的"开源许可例外":http://cygwin.com/licensing.html
@DanMoulding如果你不是微软的粉丝,那么你必须首先忽略那些为Windows开发的感受.;-)
这个过于简洁的回答掩盖了主要原因_不使用基于Cygwin的`gcc`来编译专有软件:**GPL感染.**截至2015年中期,MSYS2可能是这里的理想解决方案.它提供基于MinGW-64的`gcc` _not_受GPL许可证约束,以及基于Arch的`pacman`包管理器,用于安装其他开源依赖项.

3> TrayMan..:

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


这对cygwin 1.7.6不再起作用了.gcc:-mno-cygwin标志已被删除; 使用一个以mingw为目标的交叉编译器.
为了修改卡迪夫的有用回复,Cygwin的MinGW软件包和命令有些模糊不清.要安装MinGW-64(*几乎是你一直想要的,这些天*),安装`mingw64-x86_64-gcc-core` Cygwin软件包.然后MinGW-64将作为名为`x86_64-w64-mingw32-gcc`命令的笨拙命令提供.**请上帝,有人统一这些血腥事物的名字.**
@CMCDragonkai您可以通过运行安装实用程序并查找并勾选它们,从Cygwin站点获取mingw兼容编译器.因此,即使gcc不再生成与mingw兼容的代码,您也可以在Cygwin中运行"mingw-gcc"(这不是全名)来生成mingw编译器在msys下的相同类型的可执行文件.
@sigjuice:是的,但旧的-mno-cygwin标志仍适用于GCC 3.x:`gcc-3 -mno-cygwin`

4> dirkgently..:

维基百科在这里进行比较.

来自Cygwin的网站:

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

一系列提供Linux外观的工具.

来自Mingw的网站:

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



5> Michael Burr..:

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

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

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



6> Amir Saniyan..:

阅读这些已回答的问题,以了解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.


关于你的小常见问题:1)你的权利,如果你需要在任何地方运行并且不需要编译的东西选择类似java的东西(也不要忘记python,perl,ruby和其他脚本语言)2)对于C的情况,这有点不对,因为C的所有编译器都非常支持它.3)您仍然可以使用win32 api,但是您必须将其包装在可移植层中,因此这只是一个设计问题.
我不明白你的论点,@ Coyote21.您是说POSIX不适合跨平台开发吗?您是否说在C/C++中为多个平台编写代码的唯一合适方法是为您希望支持的每个平台编写自己的兼容层?我认为从POSIX开始的建议没有任何问题.您需要了解它能带给您多远,以及是否需要广泛的兼容性层解决方案.大型兼容层不是常态.否则就是说POSIX是完全失败的.

7> PersianGulf..:

维基百科说:

MinGW从版本1.3.3分叉Cygwin.虽然两者CygwinMinGW可以用于端口UNIX的软件Windows,它们有不同的方法:Cygwin旨在提供一个完整的POSIX layer 存在对提供的几个系统调用和库仿真Linux,UNIXBSD变种.在POSIX layer 之上运行Windows,牺牲性能在必要的兼容性.因此,这种方法要求 Windows编写的程序Cygwin在一个copylefted兼容库之上运行,该库必须与程序一起随程序一起分发source code.MinGW旨在通过直接提供本机功能和性能Windows API calls.不像 Cygwin,MinGW不需要兼容层DLL,因此不需要分发程序source code.

因为MinGW依赖Windows API calls,它不能提供完整的POSIX API; 它无法编译UNIX applications可以编译的一些Cygwin.具体而言,这适用于需要POSIX类似功能的 应用程序fork(),mmap()或者ioctl()希望在运行中运行的 应用程序POSIX environment.用编写的应用程序cross-platform library已本身被移植到MinGW,如SDL, wxWidgets,Qt,或GTK+,通常编译为容易 MinGW,因为他们会在Cygwin.

它的组合MinGWMSYS提供了一个小的,独立的环境,可以加载到可移动媒体上,而不会在注册表或计算机上的文件中留下条目.CygwinPortable提供了类似的功能.通过提供更多功能,Cygwin 安装和维护变得更加复杂.

它也可以cross-compile Windows applicationsMinGW-GCC under POSIX systems.这意味着开发人员不需要使用Windows安装MSYS来编译将在Windows没有的情况下运行的软件Cygwin.



8> Kaz..:

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

#include 
#include 

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:file.txt根据与驱动器关联的当前工作目录解析路径c:.

system使用cmd.exe /c用于运行外部命令.

我们也可以在Cygwin下编译程序.与MS Visual C使用的可再发行运行时类似,Cygwin程序将链接到Cygwin的运行时库:( cygwin1.dllCygwin本身)和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,你可以这样做.您还可以使用gcc -mwindowsMinGW和Cygwin 轻松构建一个不需要控制台窗口的程序.

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

从而:

由于需要图书馆的伴奏,Cygwin程序不比MS Visual C程序"原生".Windows上的编程语言实现有望提供自己的运行时,甚至C语言实现.Windows上没有"libc"供公众使用.

MinGW不需要第三方DLL的事实实际上是一个缺点; 它取决于Visual C运行时的未记录的Windows内部分支.MinGW这样做是因为GPL系统库例外适用msvcrt.dll,这意味着可以使用MinGW编译和重新分发GPL编辑的程序.

由于与POSIX相比msvcrt.dll,它更广泛和更深入的支持,Cygwin是迄今为止移植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解决路径处理问题时,可以开发一个单独的可执行文件,当作为带有Cygnal的Windows应用程序提供时,它可以与Windows路径一起使用,并且当安装在/usr/binCygwin下时,可以无缝地与Cygwin路径一起使用.在Cygwin下,可执行文件将透明地使用类似的路径/cygdrive/c/Users/bob.在与Cygnal版本链接的本机部署中cygwin1.dll,该路径没有任何意义,但它会理解c:foo.txt.



9> Norman Ramse..:

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

像Cygwin一样,他们必须对抗图书馆; 在他们的情况下POSIX.DLL.AT&T的工作人员都是非常棒的工程师(同样的团队给你带来了ksh和dot),他们的东西值得一试.


哇,这些是一些糟糕的网页.我终于可以在http://www2.research.att.com/sw/download/找到下载链接,但没有关于该项目的在线文档或信息.

10> vartec..:

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

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


自从我回答以来发生了什么变化,现在`clang`是一个可行的跨平台解决方案.

11> Engineer..:

要在商业/专有/非开源应用程序中使用Cygwin,您需要为Red Hat 的" 许可证收购 " 支付数万美元; 这会以相当大的成本使标准许可条款无效.谷歌"cygwin许可证费用",并看到前几个结果.

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

编辑感谢Izzy Helianthus:商业许可证不再可用或不必要,因为在Cygwin的winsup子目录中找到的API库现在正在 LGPL下发布,而不是完整的GPL.



12> 小智..:

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

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



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



14> smwikipedia..:

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

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有