2008年2月9日 星期六

免安裝、輕量、跨平台的GUI開發環境: code::block+MinGW+wxWidget+wxFormBuilder

wxWidget似乎是我第一個認真學習的GUI framework,
那時候為了幫我叔叔寫程式,survey了一番,最後決定用它來實作。
原因其實很單純,因為它是免費的,而且我的老電腦跑得動。
為什麼不學.NET或Java呢?
首先,我以前對Java的印象一直不是很好(現在有改觀了),
因為它的執行效率實在太慢了,所以很自然的,我對.NET的印象也不太好,
因為總覺得執行一個程式還要run一個底層的virtual machine會造成不必要的overhead。
另外,以前我的電腦也有跑過JBuilder,一直lag快當掉的感覺實在不太好,
看到VS.NET又這麼肥,我就直接淘汰它了。

由於當時對於視窗程式的開發不是很有經驗,
我決定直接找RAD的開發環境,
我選擇了wxDev-C++,它跟BCB有點像,所以還算容易上手。
不過其實搞定整個環境也花了我許多時間,
尤其是搞定 VC 2005 Express Edition compiler的這個部分。
總之,整個安裝過程實在令人覺得有點不耐煩。
(因為有時候電腦總免不了要重灌)

另外,我發現自己的程式也被 "綁" 在wxDev-C++這個開發環境上了,
如果我改天想用其他的開發環境來繼續開發我的程式,
或者那天wxDev-C++突然消失了(wxDev-C++也好久沒有更新了),
我的程式就無法繼續維護了。

基於上述的二種可攜性 (project file的可攜、開發環境的可攜),
以及我喜新厭舊的個性,我決定再換一個開發環境。

經過一番survey後,我決定試試code::block。
其實在決定用code::block之前,我有想到eclipse的cdt
但後來知道eclipse是用Java寫的,並親自體驗了一下它的"龐大"之後,
我決定還是用較輕巧的code::block,如果改天需要寫Java時,再來嘗試eclipse好了。

1. 安裝 code::block
code::block(後面簡稱CB)其實安裝很簡單,
只要直接到 code::block forum 抓取nightly build,
把相關的檔案(包含一些dll)解壓縮到某個資料夾就完成了。
細節可參考
How to use a nightly build
Installing Code::Blocks

2. 安裝 MinGW
MinGW是Minimal GNU for Windows的簡稱,
這個Project主要就是把gcc和gdb等GNU的開發工具移植到Windows上,
使Windows Application Developer也能享受免費而自由的開發環境。
SourceForge(MinGW)
MinGW的安裝過程其實也是把檔案解壓縮到取名為MinGW的資料夾,
不過因為MinGW的檔案很多,且檔案又分成好幾種版本,
因此建議使用它的自動下載程式MinGW-5.1.3來下載,
並用自動安裝程式gdb-6.3-2.exe來安裝gdb。
(gdb部分我沒有測試)
解壓縮完成後還必須把CB的compiler路徑設為MinGW的路徑,
方法如下:
打開CB -> Settings -> compiler and debugger
  • selected compiler選GNU GCC compiler
  • [Toolchain executables] 下的compiler's installation directory設為 $(#MINGW_DIR)
  • 出現了 "global variable editor" 的視窗,把Builtin fields的base設為你剛剛安裝好的MinGW的路徑
註: global variable editor的功用在於,它可以讓你的CB移動到其他電腦去執行時,
透過重新設定其值,使CB可以找到它所需要的執行檔案(例如compiler, library)。
其格式為 $(#_VariableName_)

安裝MinGW及gdb後,CB就可以運作了,
你可以試著寫一個簡單的HelloWorld(File -> New -> Project -> Console Application)
來測試看看。

3. 安裝wxWidget
wxWidget是一個跨平台的GUI framework,CB本身就支援wxWidget
(例如new -> project 裡就有一個wxWidget project的選項)
然而nightly built CB似乎沒有內建wxWidget,
所以我們必須自己抓回來編譯、安裝。
SourceForge(wxWidget)
因為我是在windows下,所以我應該抓的檔案是wxMSW-2.8.7.zip
抓下來解壓縮後,你必須使用MinGW的gcc來編譯它。
  1. cd _WXWIN_\build\msw
  2. set PATH=_MINGW_\bin;_MINGW_\mingw32\bin
  3. mingw32-make -f makefile.gcc BUILD=release
註: _WXWIN_是剛剛安裝wxwidget的目錄
_MINGW_是剛剛安裝MinGW的目錄

BUILD= release是編譯的一個重要選項,代表編譯出來的library已經經過最佳化,
但如果你想讓編譯出來的library具有debug資訊,讓你可以改為BUILD=debug,
然而,這樣子編譯出來的wxwidget程式執行檔會變得很大(約20mb),
且linking時會耗費許多時間。
但建議BUILD=release及BUILD=debug都各做一次,
這樣可以讓CB在選擇編譯組態時擁有release及debug兩種選擇。
其他的編譯選項請參考
_WXWIN_/INSTALL-MSW.txt 中的Basic options及Advance options

接下來你就可以file-> new -> project -> wxWidgets project來測試看看。
它會出現一個精靈來建立一個wxWidget project
其中,當它問你 wxWidgets' location時,你應該保留$(#wx)這個值,
並設定wx這個global variable為wxWidget的目錄
至於後面的wxWidget libary settings,
其本上如果你沒有用dll, unicode, monolithic等編譯選項來編譯wxWidget的話,
你是不需要打勾的。
至於Create and use precompiled header (PCH)則建議打勾,
可以加快編譯的速度。
最後面會列出一堆wx的class,如果你有用的話就把它選起來 (它是可以多選的)
關於建立wxWidget project的過程可以參考
WxSmith tutorial: Hello world

經驗1.
為什麼我用release組態編譯後,用debug再次編譯會出現compiler error?
->解決方法: 把wx_pch.h.gch這個資料夾刪除後就可以編譯了

經驗2.
為什麼會出現undefined reference to wx....?
->因為linker的設定缺少了一些library,
例如: libwxmsw28d_adv.a(for debug) 或 libwxmsw28_adv.a(for
release),
是跟wxGrid相關的library。
設定方式如下:
Project -> build options -> 選視窗左邊的release/debug
->選右邊的 [Linker Settings]
自行加入Link libraries。
(只要輸入名字就好,不需要完整路徑)

4. 安裝wxFormBuilder 3.0
這是一個設計wxWidget GUI的工具,
可以直接用拖拉的方式來建立你的表單,
它可以直接產生C++程式碼,也可以產生XRC檔案。

安裝的方式很簡單,直接到 wxFormBuilder v3.0 Downloads
下載 wxFormBuilder_v3.0.54-RC6-archive
解壓縮到資料夾後即可直接執行。
wxFormBuilder的專案檔是以.fbp結尾,所以在CB中如果點二下開啟.fbp檔時,
你必須先手動選擇wxFormBuilder.exe的路徑,以後它才會自動用wxFormBuilder來開啟。
wxFormBuilder的使用可以參考 UsingWxFormBuilder

註1 WxFormBuilder在layout時是採用Sizer,
所以使用時應該要對wxWidget的Sizer有些基本了解

註2 因為WxFormBuilder在產生程式碼的過程中會覆寫原來的.cpp檔及.h檔,
所以產生出來的Frame應該採用繼承的方式來使用,而不是直接使用。

沒有留言: