轉載_cygwin和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相比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編譯的程序可以無縫在linux上運行,根本就不能這麼理解。

cygwin官方的一個定義是Cygwin is not a way to run native linux apps on Windows. You have to rebuild your application from source if you want it to run on Windows.

翻譯過來就是
cygwin不是讓linux程序能在windows上運行的方法,如果你想要讓linux程序能在windows運行,那麼你只有用cygwin來重新編譯一下源文件。
這句話完全反駁了無縫運行在linux的說法。就是說你在linux上編譯的elf程序不能直接拿到cygwin上運行,同樣,你用cygwin編譯的程序也不是linux的elf格式,而是exe格式,exe是無法在linux上運行的。

cygwin和mingw都是爲用戶提供在windows操作系統使用GNU工具的方法,使得在windows上可以編譯爲linux寫的c源代碼並運行(讓你可以用signal等linux纔有的api)。真正的不同在於
1,cygwin大,mingw小
2,cygwin編譯後的exe需要cygwin1.dll作爲支持,而mingw不需要就可以直接運行,因爲有中間層所以cygwin慢,mingw快。
3,cygwin包含的內容更全面,能編譯通過的linux源文件更多,mingw的min是minimalist所以能編譯通過的更少。但,不是全部,就是說別指望你可以把任何爲linux寫的源代碼在cygwin或mingw編譯通過並運行。

 

What Is Cygwin?

 

 

Cygwin is a Linux-like environment for Windows. It consists of two parts: A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality.

A collection of tools which provide Linux look and feel.

 

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.

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.


What Isn't Cygwin?

 

 


Cygwin is not a way to run native linux apps on Windows. You have to rebuild your application from source if you want it to run on Windows.

Cygwin is not a way to magically make native Windows apps aware of UNIX ? functionality, like signals, ptys, etc. Again, you need to build your apps from source if you want to take advantage of Cygwin functionality.

 


MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs.

MinGW:根據我的理解,它是一個Windows下的編譯器(實際上是一系列開發工具)。與Windows下其它編譯器不同的是,MinGW與Linux下廣泛使用的GNU(基本上)完全兼容,這意味着,在Linux下如何編譯源代碼,在MinGW中也可以以完全相同的方式編譯。

我個人以爲,MinGW的出現是有原因的:有些Linux下的開發人員(比如開源陣營)發佈的源代碼通常只提供Linux下的編譯方式,而不提供Windows下的編譯方式(這可能與其不熟悉windows操作系統有關),但確實有不少用戶需要在在Windows下編譯使用此源代碼。這在種情況下,如果Windows用戶想用VC、BC等編譯器編譯該源代碼,必須重寫Makefile(各種編譯器所支持的Makefile不盡相同),工作量比較大不說,還很難保證不出錯。MinGW的出現,提供了兩個平臺下的“跨平臺編譯方案”。MinGW與MSYS相配合,連./configure都有了。與GNU不同的是,MinGW編譯生成的是Windows下的可執行文件(.exe)或庫文件(.dll,.lib)——不過編譯過程中的的中間文件仍然是.o文件,而不是.obj文件(這當然無所謂了,中間文件嘛,編譯完成後就沒有用了)。MinGW好像是在Cygwin基礎上發展而來的。順便說一下Cygwin,它與MinGW在想法上基本是一致的,兩者相比,Cygwin是重量級的(需下載50M以上直至數百兆不等,安裝後佔用空間可達1G),MinGW是輕量級的(需下載的文件只有20M,安裝後70M左右),這是單純從體積上說的,另外Cygwin現在據說也不是完全免費的了。

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倍)。下面的圖片兩者編譯生成的文件大小的對比,左側是VC6生成的,右側是MinGW生成的,圖一是編譯生成動態庫DLL的情況,圖二是編譯生成靜態庫LIB文件的情況:

 

 

總起來說,在Windows系統下,還是用VC編譯比較合適,沒辦法的情況下才會選擇MinGW。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章