我想让个人C ++项目跨平台,我正在考虑使用Cygwin / MinGW。 但它们之间有什么区别? node
另外一个问题是我是否可以在没有Cygwin / MinGW的系统上运行二进制文件? ios
维基百科说 : 编程
MinGW
从Cygwin
1.3.3版本开始。 尽管Cygwin
和MinGW
均可用于将UNIX
软件移植到Windows
,但它们有不一样的方法:Cygwin
旨在提供完整的POSIX layer
,提供Linux
,UNIX
和BSD
变体上存在的多个系统调用和库的模拟。POSIX layer
在Windows
之上运行,在必要时牺牲性能以实现兼容性。 所以,这种方法要求使用Cygwin
编写的Windows
程序在copylefted兼容库之上运行,该库必须与程序一块儿分发,以及程序的source code
。MinGW
旨在经过直接的Windows API calls
提供本机功能和性能。 与Cygwin
不一样,MinGW
不须要兼容层DLL
,所以程序不须要与source code
一块儿分发。 windows因为
MinGW
依赖于Windows API calls
,所以没法提供完整的POSIX API
; 它没法编译可使用Cygwin
编译的一些UNIX applications
。 具体来讲,这适用于须要POSIX
功能的应用程序,如fork()
,mmap()
或ioctl()
以及指望在POSIX environment
运行的应用程序。 使用本身移植到MinGW
的cross-platform library
编写的应用程序,例如SDL
,wxWidgets
,Qt
或GTK+
,一般能够像在Cygwin
同样在MinGW
轻松编译。 bash
MinGW
和MSYS
的组合提供了一个小型的自包含环境,能够将其加载到可移动媒体上,而无需在注册表或计算机上的文件中留下条目。Cygwin
Portable提供了相似的功能。 经过提供更多功能,Cygwin
安装和维护变得更加复杂。 app也能够
MinGW-GCC under POSIX systems
使用MinGW-GCC under POSIX systems
cross-compile Windows applications
。 这意味着开发人员不须要使用MSYS
安装Windows来编译将在没有Cygwin
状况下在Windows
运行的软件。 less
Cygwin
使用兼容层,而MinGW
是原生的。 这是主要的差别之一。 编程语言
Cygwin旨在为Windows提供或多或少的完整POSIX环境,包括一系列旨在提供完整的类Linux平台的工具。 相比之下,MinGW和MSYS提供了一个轻量级,简约的POSIX类图层,只有像gcc
和bash
这样的基本工具可用。 因为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许可证费用”,并看到前几个结果。
对于mingw,不会产生这样的费用,许可证(PD,BSD,MIT)很是宽松。 最多可能须要为您的应用程序提供许可证详细信息,例如使用mingw64-tdm时所需的winpthreads许可证。
编辑感谢Izzy Helianthus:商业许可证再也不可用或没必要要,由于在Cygwin的winsup子目录中找到的API库如今正在 LGPL下发布,而不是完整的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提供了_stat
, system
和printf
。 (咱们也能够选择静态连接运行时。)
在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将根据您的可执行文件的位置解析/
path,并指望sh.exe
程序与您的可执行文件位于sh.exe
位置。 Cygwin和MinGW都容许您使用Win32功能。 若是要调用MessageBox
或CreateProcess
,则能够执行此操做。 您还可使用gcc -mwindows
在MinGW和Cygwin下轻松构建一个不须要控制台窗口的程序。
Cygwin不是严格的POSIX。 除了提供对Windows API的访问以外,它还提供了本身的一些Microsoft C函数的实现(在msvcrt.dll
找到的东西或可从新分发的msvcrtnn.dll
运行时)。 一个例子是spawn*
函数系列,如spawnvp
。 这些是在Cygwin上使用而不是fork
和exec
的好主意,由于它们更好地映射到没有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调用来控制控制台。
然而:
/bin/sh
和其余问题。 这些差别使得Cygwin程序“非本地”。 若是程序将路径做为参数或从对话框输入,则Windows用户但愿该路径的工做方式与在其余Windows程序中的工做方式相同。 若是它不起做用,那就是一个问题。 插件:在LGPL发布后不久,我启动了Cygnal (Cygwin Native Application Library)项目,提供了一个Cygwin DLL的分支,旨在解决这些问题。 程序能够在Cygwin下开发,而后使用Cygnal版本的cygwin1.dll
进行部署而无需从新编译。 随着这个库的改进,它将逐渐消除对MinGW的需求。
当Cygnal解决路径处理问题时,能够开发一个单独的可执行文件,看成为带有Cygnal的Windows应用程序提供时,它能够与Windows路径一块儿使用,而且当安装在Cygwin下的/usr/bin
时,能够无缝地与Cygwin路径一块儿使用。 在Cygwin下,可执行文件将透明地使用/cygdrive/c/Users/bob
类的路径。 在与cygwin1.dll
的Cygnal版本连接的本机部署中,该路径没有意义,而它将理解c:foo.txt
。