minGW, cygwin, GnuWin32【C++的跨平臺交叉編譯問題】

這幾天在整C++的跨平臺交叉編譯問題,總算告一段落,把具體涉及的內容整理如下:

首先,三個的官方網站分別是:
minGW:http://www.mingw.org
cygwin:  http://www.cygwin.com
gnuwin32:http://gnuwin32.sourceforge.net

minGW給那些習慣於在Linux上開發的人員,在windows上提供了一套類似的工具集。
cygwin主要是對於再Linux的程序,無需改動代碼即可移植到windows上
gnuwin32主要是對習慣linux工具的人員,在windows上提供一套類似的命令。

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的做法.

Cygwin

這個項目的名字來源於:GNU、Cygnus、Windows,3者的縮寫。Cygwin的目標是:構建一套Windows下的Linux模擬環境。因此,Cygwin是一個龐大的項目,不只包括Linux下的開發環境,也包括工作環境,和各種各樣的Linux下的軟件。

在早期,Cygwin的核心是cygwin1.dll,可以認爲它是一個POSIX界面的實現,依靠這個動態鏈接庫,Unix/Linux下的軟件 可以很容易的移植到Windows下,並且風格保持原有的不變。不過隨着Cygwin的發展,越來越多的Unix/Linux程序的移植,建立基於 Cygwin的複雜程序依賴的庫也越來越多,現在裝完默認配置的Cygwin後,就會發現有很多cyg打頭的動態鏈接庫。

目前Cygwin由RedHat維護和支持。在版權上,由於Cygwin不是一個軟件,而是由成百上千的軟件堆砌起來的系統,裏面有商業軟件的成分/概念,所以它的許可證有開源性質的(GPL)和商業性質的(從RedHat購買)兩種。

MinGW

這個項目的名字來源於:Minimalist GNU for Windows的縮寫。

最初,MinGW的目標定位爲:Windows下的開源的開發環境。它包括一系列軟件:編譯工具、鏈接工具、轉儲工具、調試工具、和其它開發工具等。另一方面,MinGW還提供一些開源的基礎支持庫,像GNU的C/C++ RT庫(libclibstdc++),POSIX的基本調用界面(包括pthread),甚至還有OpenGL和Windows API的調用接口等。幾乎所有MinGW中的軟件都是從GNU項目或Linux下移植到Windows下的。

後來MinGW有了一個子項目叫:MSYS,其中包括了更多的Linux工具,其目標類似Cygwin:構建一套Windows下的Linux模擬環境。

總之,MinGW中的東西很雜,和Cygwin之間有相當一部分是重複的(目前,Cygwin項目中已經集成MinGW了)。但MinGW和Cygwin的實現思路和設計思想是不同的:

  1. Cygwin通過一箇中間層的動態鏈接庫,將位於下層的Windows API,和位於上層的使用POSIX界面的應用連接起來,好處是應用在Linux與Windows之間移植更加方便,風格更加一致;缺點是發佈應用時一定 要帶上Cygwin的環境動態庫,應用執行效率也略微有點低。

  2. MinGW在基礎支持庫層次,使用靜態鏈接的方式,這樣生成的應用更加地本地化,應用執行效率也稍高一些。所以MinGW聲明:基於MinGW開發的應用,不需要依賴任何第三方的C/C++ RT動態鏈接庫,僅依賴Windows自身的運行環境:

    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.

不過上面的結論不是絕對的,比如:

  • 當你使用MinGW GCC的-mthreads選項(和線程安全異常處理有關)時,就會動態鏈接到 mingwm10.dll。

  • 還有如果你使用MinGW GCC 4.4.0默認選項編譯C++程序,就會動態鏈接到libgcc_s_dw2-1.dll,參考下面

    Dynamic linking with libgcc_s_dw2-1.dll is necessary to throw exceptions between different modules, such as between two DLLs or a DLL and an EXE. Consequently, it is the default for all languages other than C. To disable this dynamic linking, use -static-libgcc. To enable this dynamic linking in C, use -shared-libgcc.

MinGW的POSIX界面遠沒有Cygwin實現的那麼全面(比如:連BSD/Linux Socket都沒有,只能用Winsock),所以看起來MinGW只是用來開發Windows專屬應用的工具集。

在版權上,MinGW比Cygwin更開放些。

我用過MSYS和Cygwin之後,發現MSYS相比Cygwin還有很多不足:

  1. MSYS中的工具更像是Unix/Linux下的工具在Windows下的移植版,其中有些工具可以支持Windows的一些特徵(比如:目錄分隔 用"\"),而有些並沒有Unix/Linux下原始的版本那麼好用(比如:bash、sed等)。而Cygwin是努力在Windows下構建一套完全 參照Unix/Linux體驗的環境。

  2. MSYS中的工具很雜,和MinGW中的工具交織在一起(有時,開發工具和實用程序的界限並不是很截然,況且經常要配合使用),組織很鬆散,還有一 些愛好者自己提供軟件包。如此,搭建基於MSYS的Unix/Linux環境變得稍繁瑣,你需要更加謹慎地考慮軟件包的依賴關係。而使用Cygwin就方 便多了,它的安裝程序會歸類顯示軟件包的組織關係,還能一定程度上幫你解決軟件包的依賴關係。

推薦以下面這種方式搭建Windows下的Unix/Linux開發環境:

  1. 使用Cygwin的Unix/Linux工作環境,比如:bash、tar、awk、sed、od、man等。

  2. 使用MinGW的C/C++開發工具,比如:binutils、gcc、gdb、make、strip等;使用MinGW的基礎支持庫,比如:GNU的libc、libstdc++、POSIX的基本調用界面等。

  3. 根據需要,使用額外的支持/開發庫,比如:pthread、openssl、libiconv、gettext、boost、wxWidgets等。

注意:

  1. 有些支持/開發庫可以在MinGW項目的Sourceforge下載地址找到,像pthread(mingw gcc-4.4中包含)、openssl、libiconv、gettext等。也可以從這些庫官方的項目地址,或其它的Windows移植版項目地址下載,總之,它們之間的聯繫比較鬆散。

  2. 如果有一些程序,在MinGW和Cygwin安裝後有重複,可以用各種技巧設定它們被選擇的優先級,比如:設置PATH環境變量中的搜索目錄順序,建立符號鏈接等方法。

  3. 獲取最新mingw.一個make就搞定:
    http://www.profv.de/mingw_cross_env/#tutorial
    一般只要make gcc就OK了。

 

MinGW 是 GCC 編譯器的 Win32 精簡移植版,理論上 MinGW 可以將標準的 C/C++/Fortran/... 原始碼編譯成 Win32 原生程式,但實務上光移植編譯器仍然有所不足,因為很多現存的軟體只有針對 Unix-like 環境撰寫 Makefile 或 autotools 配置檔,因此有必要將建置軟體過程最常用到的 Linux 功能也一併模擬,這就是 MSYS 的由來。

MSYS 純粹就只是為了編譯程式開一條方便之門,僅提供了少許的 Linux 工具,並且模擬 Linux 的命令解釋器和目錄架構。這和 MinGW 之前的 Cygwin 有很大的不同,Cygwin 的目標是在 Windows 上盡可能完整地模擬 Linux。事實上 Cygwin 在很多場合被視為既非 Windows 亦非 Linux 的獨立 target 平臺。

 http://stackoverflow.com/questions/771756/what-is-the-difference-between-cygwin-and-mingw

 

http://hi.baidu.com/opaquefog/blog/item/f3294f9095982e82a977a4b7.html

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