MinGW與Cygwin的一些雜談

引用: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了。操作系統

相關文章
相關標籤/搜索