我想让个人C ++项目跨平台,我正在考虑使用Cygwin / MinGW。 可是他们之间有什么区别呢?html
另外一个问题是,若是没有Cygwin / MinGW,我可否在系统上运行二进制文件?node
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标准的开发和运行环境。
从而:
维基百科说 :
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
一块儿分发。因为
MinGW
依赖于Windows API calls
,所以没法提供完整的POSIX API
; 它没法编译一些能够用Cygwin
编译的UNIX applications
。 具体而言,这适用于须要POSIX
功能(如fork()
,mmap()
或ioctl()
以及指望在POSIX environment
运行的应用程序。 使用自己已经移植到MinGW
的cross-platform library
(例如SDL
,wxWidgets
,Qt
或GTK+
编写的应用程序一般在MinGW
编译将像在Cygwin
那样容易。
MinGW
和MSYS
的组合提供了一个小型自包含的环境,能够将其加载到可移动媒体上,而无需在注册表或计算机上的文件中留下条目。Cygwin
Portable提供了相似的功能。 经过提供更多的功能,Cygwin
安装和维护变得更加复杂。也能够
MinGW-GCC under POSIX systems
用MinGW-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
, system
和printf
。
在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函数。 若是你想调用MessageBox
或CreateProcess
,你能够这样作。 你也能够在MinGW和Cygwin下使用gcc -mwindows
轻松地建立一个不须要控制台窗口的程序。
Cygwin不是严格的POSIX。 除了提供对Windows API的访问以外,它还提供了一些Microsoft C函数(在msvcrt.dll
找到的东西或可从新分发的msvcrtnn.dll
运行时)的本身的实现。 一个例子就是spawn*
系列的spawn*
系列。 这些在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本地应用程序库)项目,以提供一个旨在解决这些问题的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层,只有像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是一个相似于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