Cygwin 和MinGW 的區別與聯繫是怎樣的?

MinGW中有一個MSYS,同樣是模擬unix環境。它和Cygwinu相比有什麼相同和不同,又有什麼優點和缺點呢?


看了目前的幾個回答,沒有完全正確的。

在講區別聯繫之前,我們先看一下這幾個東東的前世今生。

Cygwin,原 Cygnus 出品(已被紅帽收購),目前是 RedHat 名下的項目。項目的目的是提供運行於 Windows 平台的類 Unix 環境(以 GNU 工具為代表),為了達到這個目的,Cygwin 提供了一套抽象層 dll,用於將部分 Posix 調用轉換成 Windows 的 API 調用,實現相關功能。這裡面最典型的,最基本的模擬層就是那個 cygwin1.dll。除此之外,隨著 Linux 系統的發展壯大,目前的 Cygwin 已經不僅僅提供 POSIX 兼容,因此也順帶多了更多模擬層的依賴關係。

Cygwin 的目錄結構基本照搬了 linux 的樣子,但同時,也兼容了 Windows 的許多功能:大部分應用使用 Unix 風格的路徑,Windows的盤符通過類似掛載點的方式提供給 Cygwin 使用;Cygwin 中既可以運行 Cygwin 的應用(依賴模擬層),又可以運行 Windows 應用,而傳遞給應用的路徑會經過它的模擬層變換,以此保證程序運行不會出錯。

由於它的模擬層實現了相當良好的 Posix 兼容,人們試著將許多重要的 Linux/BSD 應用移植到了Cygwin下,使得Cygwin越來越大,功能也越來越豐富,以至於目前很多人直接把將Linux應用移植到Windows平台的任務都交給了Cygwin(當然,這種移植並非原生)。事實上,Cygwin誕生之初,本就是想通過GCC編譯出Windows應用來,因為bootstrap GCC而順帶搞了一坨別的東西過來,最後發展到現在的。

小結:Cygwin是運行於Windows平台的POSIX「子系統」,提供Windows下的類Unix環境,並提供將部分 Linux 應用「移植」到Windows平台的開發環境的一套軟體。按照我經常開玩笑的話來講,Cygwin 基本上就是傳說中的 GNU/NT 系統(對照 GNU/Linux,GNU/BSD,GNU/HURD)。

MinGW,Minimalist GNU for Windows,用於開發原生(32位) Windows 應用的開發環境。它主要提供了針對 win32 應用的 GCC、GNU binutils 等工具,以及對等於 Windows SDK(的子集)的頭文件和用於 MinGW 版本 linker 的庫文件(so、a等,而不是 VC 的 lib)。

MinGW 能夠替代 cl 用於編譯不包含 MFC 的、以 WinSDK 為主的 Windows 應用,並且編譯出來的應用不依賴於第三方的模擬層支持,其運行時為大部分 Windows 標配的 msvcrt(故稱原生 Windows 應用)。除此之外,MinGW 也支持 GCC 支持的其他語言。

因為這些原因,MinGW 被許多 Linux 上發展起來的開發工具選擇為 Windows 版本的默認編譯器,例如 CodeBlocks,例如 DevC++。

小結,MinGW 是用於進行 Windows 應用開發的 GNU 工具鏈(開發環境),它的編譯產物一般是原生 Windows 應用,雖然它本身不一定非要運行在 Windows 系統下(是的 MinGW 工具鏈也存在於 Linux、BSD 甚至 Cygwin 下)。

MSYS,由於 MinGW 本身僅代表工具鏈,而在 Windows 下,由於那個shi一樣的cmd,以及配套的命令行工具不夠齊全(也不舒服),因此,MinGW 開發者從曾經比較舊的 Cygwin 創建了一個分支,也用於提供類 Unix 環境。但與 Cygwin 的大而全不同,MSYS 是沖著小巧玲瓏的目標去的,所以整套 MSYS 以及 MinGW,主要以基本的 Linux 工具為主,大小在 200M 左右,並且沒有多少擴展能力。

MSYS 是用於輔助 Windows 版 MinGW 進行命令行開發的配套軟體包,提供了部分 Unix 工具以使得 MinGW 的工具使用起來方便一些。如果不喜歡龐大的 Cygwin,而且使用不多,可以試試。不過喜歡完整體驗、不在乎磁碟佔用等等,還是推薦 Cygwin 而不是 MSYS。

MinGW-w64,前面提到的 MinGW,是針對 32 位 Windows 應用開發的。而且由於版本問題,不能很好的支持較新的 Windows API。MinGW-W64 則是新一代的 MinGW,支持更多的 API,支持 64 位應用開發,甚至支持 32 位 host 編譯 64 位應用以及反過來的「交叉」編譯。除此之外,它本身也有 32 位和 64 位不同版本,其它與 MinGW 相同。

MSYS2,由於 MinGW 萬年不更新,MSYS 更是,Cygwin的許多新功能 MSYS 沒有同步過來,於是 Alex 等人建立了新一代的 MSYS 項目。仍然是 fork 了 Cygwin(較新版),但有個更優秀的包管理器 pacman,有活躍的開發者跟用戶組,有大量預編譯的軟體包(雖然肯定沒有Cygwin多)……對於不喜歡龐大的 Cygwin 的用戶而言,推薦試試 msys2。

區別(小結):Cygwin是模擬 POSIX 系統,源碼移植 Linux 應用到 Windows 下;MinGW 是用於開發 Windows 應用的開發環境。

聯繫:均提供了部分 Linux 下的應用,多跑在 Windows 上;MinGW 作為 Cygwin 下的軟體包,可以在 Cygwin 上運行。


1、從目標上說

  • MinGW 是讓Windows 用戶可以用上GNU 工具,比如GCC。

  • Cygwin 提供完整的類Unix 環境,Windows 用戶不僅可以使用GNU 工具,理論上Linux 上的程序只要Cygwin 重新編譯,就可以在Windows 上運行。

2、從能力上說

  • 如果程序只用到C/C++ 標準庫,可以用MinGW 或Cygwin 編譯。

  • 如果程序還用到了POSIX API,則只能用Cygwin 編譯。

3、從依賴上說

  • 程序經MinGW 編譯後可以直接在Windows 上面運行。

  • 程序經Cygwin 編譯後運行,需要依賴安裝時附帶的cygwin1.dll。

Cygwin是用一個dll模擬linux環境來「欺騙」應用程序,好像自己運行在linux環境下;而mingw是在編譯時提供linux到windows必要代碼的「翻譯」轉換,用到的還是windows運行時庫。

在cygwin下編譯出來的程序需要cygwin.dll才能在windows下運行,源碼拿到linux環境下重新編譯就可以在linux下跑起來;mingw環境下編譯出來的程序,只能在windows下跑,源碼在linux環境下編譯多半通不過。

這是我粗淺的了解,歡迎糾正


補充一下,因為cygwin是虛擬了一個linux環境(cygwin.dll),運行時都需要這個中間模塊,所以運行起來會慢一些。如果僅僅是學習和一般使用,這種慢很難察覺。但是如果是為了科學計算,差別會明顯。(cygwin下30s,mingw下運行只需6s)

另外,cygwin下也有mingw的實現版本。 推薦使用這種方式來使用mingw。


一個依賴cygwin1.dll把unix調用翻譯成win32調用,另一個不需要,也就是不支持unix調用


只說下 cygwin1.dll 這個東西,這玩意真心關係不大,雖然 mingw 用不著依賴類似的東西,君不見用 cl.exe 編譯一樣要 msvcrtXX.dll,電腦上N多個 VC 20XX Redistributable 就是這玩意

linux 下也有 glibc 啊,你不爽也可以自己帶一個其他版本的 libc ,雖然一般是作死行為


上面說得很清楚了,我補充個應用例子,使用cygwin登陸SSH 伺服器。

現在的伺服器在國外,可使用SSH和VNC登陸,VNC進去後再開terminal,明顯反應速度太慢,延遲嚴重;而使用putty通過SSH進去,延遲要好上不少,但putty無法調整字體大小,那麼小的字體看上去很費力。

期間還試過SecureCRT,很方便,但同樣無法改變字體大小。想到cygwin,下個安裝包,安裝過程中查找ssh相關的包勾選上,待安裝完成後,就可以使用SSH了,直接Ctrl加+調整字體,非常方便,字體顏色、背景顏色等都可以更改,就像在Linux中使用terminal一樣。


目前最高票( @葉王 )的做法是不對的, 不要把MinGW和Cygwin混在一塊進行同範疇的對比。

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

MinGW是跑在windows上的gcc toolchain,跟msvc編譯器是同範疇的東西, Cygwin和MSYS是跑在windows上的可運行POSIX應用程序的工具環境,shell環境,跟linux下的wine同範疇。


首先說mingw cygwin的區別吧,mingw一開始是分為兩個部分的w32api和mingwrt,前者提供win32的系統頭文件和系統dll的導出庫,而後者提供c運行庫msvcrt的導出庫順帶添加了部分msvcrt沒有得函數 用於支持gcc等工具鏈的構建,cygwin是在win32的基礎上模擬了posix的介面,前文提到的w32api這個包cygwin也會用到,所以它們的區別僅僅在於mingw只提供win32的函數導出,而cygwin在前者的基礎上有模擬了posix介面,而且mingw只包括編譯器和庫,cygwin提供了一個完整的類unix運行時環境。它們的聯繫從前面也能看出cygwin包括了除msvcrt庫之外的整個mingw,cygwin使用了newlib提供c運行時。再補充一點,新版的cygwin1.dll這個庫是使用mingw-w64工具編譯的,所以說它們的關係是剪不斷理還亂,你只用注意cygwin提供posix介面mingw不提供posix介面就好了


MSYS2不完全是基於MinGW的,至少其原生工具都是鏈接到自帶的一套特定版本的Cygwin DLL的。基本上只是用libalpm管理MSYS2、MinGW-w64和MinGW三個不同子系統的軟體包吧。

Cygwin、MSYS和Git for Windows里各有一套Cygwin DLL而且互不兼容。MinGW那兩個子系統都不需要鏈接到任何版本的Cygwin DLL


http://www.cnblogs.com/fancybit/archive/2012/07/08/2581590.html


mingw是原生模擬,cygwin是全部模擬,和swt/swing的區別差不多

Windows模擬Linux環境UnxUtils MinGW Cygwin比較


推薦閱讀:

TAG:Linux | Unix | Cygwin | MinGW | MSYS |