天天看點

Microsoft Visual C++ 與 MinGW,附圖

2008.12.23補記:我對mingw的了解确實不多,本文是我(liigo)“對mingw的初步印象和感性認識”(而非“對mingw的蓋棺定論式的評價”),文中有錯誤之處在所難免,敬請批評指正;如果有讀者受我誤導,深表歉意。不想因為此文浪費某些讀者的寶貴時間,特此說明。

這幾天試用wxWidgets,分别用VC6和MinGW5編譯通過,下面是一些記錄。

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檔案的情況:

Microsoft Visual C++ 與 MinGW,附圖
Microsoft Visual C++ 與 MinGW,附圖

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