Different Between Cygwin And MinGw

1.What is Cygwin ?

  • a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows.
  • a DLL (cygwin1.dll) which provides substantial POSIX API functionality.
  • 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. 函數

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.
  • cygwin不是讓linux程序能在windows上運行的方法,若是你想要讓linux程序能在windows運行,那麼你只有用cygwin來從新編譯一下源文件。
    這句話徹底反駁了無縫運行在linux的說法。就是說你在linux上編譯的elf程序不能直接拿到cygwin上運行,一樣,你用cygwin編譯的程序也不是linux的elf格式,而是exe格式,exe是沒法在linux上運行的。

Official Website:http://www.cygwin.com/工具

2.What is MinGW?

    MinGW, a contraction of "Minimalist GNU for Windows", is a minimalist development environment for native Microsoft Windows applications.1.What is Cygwin ?
  • MinGW provides a complete Open Source programming tool set which is suitable for the development of native MS-Windows applications, and which do not depend on any 3rd-party C-Runtime DLLs. (It does depend on a number of DLLs provided by Microsoft themselves, as components of the operating system; most notable among these is MSVCRT.DLL, the Microsoft C runtime library. Additionally, threaded applications must ship with a freely distributable thread support DLL, provided as part of MinGW itself).
  • 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.
  • Official Website:http://www.mingw.org/

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。

3.Different Between Cygwin And 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了。

4.How to choose Between Cygwin And MinGw ?

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編譯經過並運行。

相關文章
相關標籤/搜索