引用:http://www.cnblogs.com/fancybit/archive/2012/07/08/2581590.htmlhtml
首先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了。windows
=====================api
1.修改编译器,让window下的编译器把诸如fork的调用翻译成等价的形式--这就是mingw的作法.
2.修改库,让window提供一个相似unix提供的库,他们对程序的接口如同unix同样,而这些库,固然是由win32的API实现的--这就是cygwin的作法.函数
看到MinGW和CgyWin这两个toolchain,因为以前没研究过c(只用来应付过考试),因此这么经典的工具都不知道。工具
MinGW是Minimalistic GNU for Windows的缩写,是gcc的windows实现,也就是一个编译器;能够在windows下写unix like的代码,即调用fork(),pthread()等unix类库,MinGW会把这些调用编译成对应的windows kernel32 调用,执行的时候不依赖MinGW,效率也比较高。通常大型程序须要MSYS辅助。性能
CygWin像一个平台,是让windows拥有unix like环境的软件,gcc是安装在GygWin的编译器;CygWini的gcc环境和Unix的gcc环境能够划等号;编译一个大型程序,光靠一个GCC是不够的,还须要有Autoconf等工具来配置项目,CygWin就提供了这些工具。可是GygWin编译出来的程序要加入cygwin1.dll才能跑,cygwin1.dll把unix-like的函数调用转化成等价的windows调用,固然也能够经过 -mno-cygwin来依赖MinGW,就不用cygwin1.dll了。操作系统