Cygwin is a unix-like enviroment and command-line interface for microsoft windows. It consists of two parts: A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality. linux
A collection of tools which provide Linux look and feel. shell
The Cygwin DLL currently works with all recent, commercially released x86 32 bit and 64 bit versions of Windows, with the exception of Windows CE. windows
Note that the official support for Windows 95, Windows 98, and Windows Me will be discontinued with the next major version (1.7.0) of Cygwin. api
Cygwin is huge and includes most of the Unix tools and utilities. It also include the commonly used Bash shell. app
A collection of tools which provide Linux look and feel. socket
The Cygwin DLL currently works with all recent, commercially released x86 32 bit and 64 bit versions of Windows, with the exception of Windows CE. ide
Note that the official support for Windows 95, Windows 98, and Windows Me will be discontinued with the next major version (1.7.0) of Cygwin. 函数
Official Website:http://www.cygwin.com/工具
MinGW:根据个人理解,它是一个Windows下的编译器。与Windows下其它编译器不一样的是,MinGW与Linux下普遍使用的GNU(基本上)彻底兼容,这意味着,在Linux下如何编译源代码,在MinGW中也能够以彻底相同的方式编译。 性能
例如wxWidgets-2.6.2在Windows下的编译方式:
用VC编译的话,有两种方式:VC工程,Makefile。前者就不用说了,用VC打开*.dsw文件,F7就能够了。这里说一下Makefile的编译方式,首先进入命令行窗口(cmd.exe 或 command.exe),切换路径到wxWidgets源代码所在目录下的 build/msw 子目录,执行“nmake -f makefile.vc”便可。
用MinGW编译的话,基本上与前面相似,也是进入命令行窗口(cmd.exe 或 command.exe),切换路径到wxWidgets源代码所在目录下的 build/msw 子目录,只是执行的命令行是“mingw32-make -f makefile.gcc”。最终生成的库文件位于lib目录中。固然,编译以前可能须要设置一下,好比指定编译为动态库(DLL)仍是静态库(LIB),或者是否采用UNICODE,等等,设置方式就是修改 build/msw 子目录中的 config.vc 或 config.gcc 文件。
VC6和MinGW相比,二者在编译速度,以及在编译后的文件的大小方面都有较大不一样。根据我编译wxWidgets时所作的简单统计,VC6的编译速度比MinGW至少快一倍,VC6编译生成的动态库DLL文件比MinGW小一倍左右,VC6编译生成的静态库LIB文件比MinGW要大很多(大约是1.5倍)。
总起来讲,在Windows系统下,仍是用VC编译比较合适,没办法的状况下才会选择MinGW。
二者出现的背景:
Unix下编译经过的C代码,在win32下编译是不能经过的 ,固然Unix 和win32的API都是符合标准C,也就是说,大多数函数调用在unix和win32下是相同的.可是,unix有本身一些独特的API(如fork,spawn,signals,select,sockets等),若是代码中使用了这些API,在win32下固然找不到对应的库.
可是,这些API的功能在win32中也能实现,也许你已经发现了一个能让window编译Unix风格代码的方法:
1.修改编译器,让window下的编译器把诸如fork的调用翻译成等价的形式--这就是mingw的作法.
2.修改库,让window提供一个相似unix提供的库,他们对程序的接口如同unix同样,而这些库,固然是由win32的API实现的--这就是cygwin的作法.
MinGW的出现是有缘由的:有些Linux下的开发人员(好比开源阵营)发布的源代码一般只提供Linux下的编译方式,而不提供Windows下的编译方式,但确实有很多用户须要在在Windows下编译使用此源代码。这在种状况下,若是Windows用户想用VC、BC等编译器编译该源代码,必须重写Makefile(各类编译器所支持的Makefile不尽相同),工做量比较大不说,还很难保证不出错。MinGW的出现,提供了两个平台下的“跨平台编译方案”。MinGW与MSYS相配合,连./configure都有了。与GNU不一样的是,MinGW编译生成的是Windows下的可执行文件(.exe)或库文件(.dll,.lib)——不过编译过程当中的的中间文件仍然是.o文件,而不是.obj文件。
首先MingW和cygwin均可以用来跨平台开发。
MinGW是Minimalistic GNU for Windows的缩写,也就是Win版的GCC。
Cygwin则是全面模拟了Linux的接口,提供给运行在它上面的的程序使用,并提供了大量现成的软件,更像是一个平台。
相对的MingW也有一个叫MSys(Minimal SYStem)的子项目,主要是提供了一个模拟Linux的Shell和一些基本的Linux工具。由于编译一个大型程序,光靠一个GCC是不够的,还须要有Autoconf等工具来配置项目,因此通常在Windows下编译ffmpeg等Linux下的大型项目都是经过Msys来完成的,固然Msys只是一个辅助环境,根本的工做仍是MingW来作的。
用MingW和cygwin编译出来的程序的区别。
首先MingW和cygwin都不能让Linux下的程序直接运行在Windows上,必需经过源代码从新编译。
现代操做系统包括Windows和Linux的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之因此两者上的程序不能兼容,主要是它们对这些功能具体实现上的差别,首先是可执行文件的格式,Window使用PE的格式,而且要求以.EXE为后缀名。Linux则使用Elf。其次操做系统的API也不同,如Windows用CreateProcess()建立进程,而Linux使用fork()。
因此要移植程序必然要在这些地方进行改变,MingW有专门的W32api头文件,来把代码中Linux方式的系统调用替换为对应的Windows方式。而Cygwin则经过cygwin1.dll这个文件来实现这种API的转换,并模拟一个Linux系统调用接口给程序,程序依然以Linux的方式调用系统API,只不过这个API在cygwin1.dll上,cygwin1.dll再调用Windows对应的实现,来把结果返回给程序。
能够用查看他们编译好的程序的导入表来验证这点。
两者生成的程序都是能在Windows上运行的EXE文件,显然都是PE格式,用一个PE格式查看工具检查一下就能发现,Cygwin生成的程序依然有fork()这样的Linux系统调用,但目标库是cygwin1。而MingW生成的程序,则所有使用从KERNEL32导出的标准Windows系统API。
这样看来用Mingw编译的程序性能会高一点,并且也不用带着那个接近两兆的cygwin1.dll文件。
但Cygwin对Linux的模拟比较完整,甚至有一个Cygwin X的项目,能够直接用Cygwin跑X。
另外Cygwin能够设置-mno-cygwin的flag,来使用Mingw编译。
而与Cygwin更有可比性的MSys上的工具也是经过Cygwin这种模拟的方式来提供的。
总之这两个项目有千丝万缕的关系,一个不恰当的比方,若是Mingw是MFC,Cygwin就是.NET了。
MinGW相比CygWin/gcc来说,更加贴近win32。由于它几乎支持全部的Win32API。它所链接的程序,不须要任何第三方库便可运行。
CygWin/gcc,其实这是两个东西。CygWin是一个让Windows拥有Unix-like环境的软件。而gcc就是安装在CygWin上的编译器。
CygWin/gcc与MinGW的最大区别在于:使用CygWin/gcc能够在Windows下调用unix-like的API,(如fork,spawn,signals,select,sockets等)。也就是说Cygwin是运行在Windows下的,可是她使用的是Unix-like系统的函数和思想。因为这个区别,致使的结果就是用CygWin/gcc编译出来的程序能够无缝的运行在*nix环境下。可是若是调用了unix特有的API函数,在windows环境下不能正常运行,若是想在windows下正常运行的,就必须依赖cygwin1.dll,速度上会有些影响。
而用MinGW编译出来的程序,若是源代码里面调用了unix环境的API,则MinGW会把这些对UNIX的API调用翻译成win32下等价的形式。同时这个程序是不能在windows下运行的。
若是你是想在windows环境下开发linux运行程序,那么CygWin/gcc是你的不二之选。
而若是你想开发的是windows运行程序,而且追求速度,那么两者相比而言,MinGW是更好的选择
cygwin和mingw都是为用户提供在windows操做系统使用GNU工具的方法,使得在windows上能够编译为linux写的c源代码并运行。真正的不一样在于1,cygwin大,mingw小2,cygwin编译后的exe须要cygwin1.dll做为支持,而mingw不须要就能够直接运行,由于有中间层因此cygwin慢,mingw快。3,cygwin包含的内容更全面,能编译经过的linux源文件更多,mingw的min是minimalist因此能编译经过的更少。但,不是所有,就是说别期望你能够把任何为linux写的源代码在cygwin或mingw编译经过并运行。