而与Cygwin更有可比性的MSys上的工具也是通过Cygwin这种模拟的方式来提供的

时间:2021-12-11 07:39:37

GNS工具链:GCC是linux下的编译器

POSIX API:可移植操纵系统接口

首先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了。

=====================

1.改削编译器,让window下的编译器把诸如fork的挪用翻译成等价的形式--这就是mingw的做法. 
2.改削库,让window供给一个类似unix供给的库,他们对措施的接口如同unix一样,而这些库,固然是由win32的API实现的--这就是cygwin的做法.