2008-10-09 作者:佚名
和GTK、QT、SWT、SWING 一樣,wxWidgets 也是一種開源跨平台的GUI 框架。 因wxWidgets 和MFC 有些淵源,有些親近,故要體驗一番wxWidgets。 現在最新版是2.8.7。 wxWidgets 程序還可運行於Windows CE、Palm OS。 不但包括GUI,還有Media、Socket、ODBC 等庫。
詳情請見wxWidgets的官方網站是: http://www.wxwidgets.org
本篇介紹VC++6.0 下如何搭建wxWidgets 的開發環境,包括編譯wxWidgets 源碼和配置VC 環境。 所用wxWidgets 的版本是2.8.7。
第一步:下載並安裝wxWidgets
在http://www.wxwidgets.org/downloads/下載到wxWidgets源碼。
你可以下載Windows安裝版http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.7-Setup.exe (11.9M)
或者是Zip壓縮版http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.7.zip (15.9M)
假如我們下載的是wxMSW-2.8.7-Setup.exe,就可運行它,過程中我們假定選擇的安裝目錄是d:\wxWidgets-2.8.7 。 完成後,我們看到安裝目錄所在空間的大不是127M。
注意要給wxWidgets 有足夠的剩餘空間,單是編譯一個版本的靜態庫就會增至300多M,如果還要編譯動態庫再選擇上DEBUG 或者RELEASE、ASCII 或是UNICODE 等,還要編譯sample 的話,最後空間能夠暴到2G。
第二步:編譯wxWidgets
編譯方式有兩種,一種是在VC++ 中打開wx.dsw 進行編譯,另一種是用nmake 在命令行下編譯。
1) nmake 編譯
運行cmd.exe 來到命令行下,進入到目錄d:\wxWidgets-2.8.7,然後執行
D:\wxWidgets-2.8.7> nmake -f makefile.vc
默認是編譯成DEBUG 版的靜態庫。 也許我們在編譯之前需要根據自己的需要進行一些設置:
打開D:\wxWidgets-2.8.7 \include\wx\msw\setup.h
保證第110行的#define wxUSE_DEBUG_NEW_ALWAYS設置為0。 默認是0 的。
將1137行的#define wxUSE_IOSTREAMH設置為0,否則無法使用VC的模板庫(不能用std命名空間下的)。 默認是1。
如果要使用wxWidgets提供支持數據庫的ODBC類,將#define wxUSE_ODBC設為1。 默認是1。
如果你想生成動態庫,或生成的是Release版的,你可以修改D:\wxWidgets-2.8.7 \build\msw\config.vc文件。 打開該文件你能看到可以更改的選項,其中重要的幾個如下:
# What type of library to build? [0,1] -- 生成庫的類型,0為靜態庫,1為動態庫
SHARED = 0
# Compile Unicode build of wxWidgets? [0,1] -- 是否使和UNICODE,0 否,1 是
UNICODE = 0
# Type of compiled binaries [debug,release] -- 是debug 還是release
BUILD = debug
其中還有許多顧名思義的選項,請根據需求修改。
對於config.vc 中的選項也可以通過命令行覆蓋掉配置文件中的值,如編譯命令用
D:\wxWidgets-2.8.7> nmake -f makefile.vc SHARED=1 UNICODE=1 BUILD=release
就是編譯release 版,支持UNICODE 的動態庫了。
動態庫和靜態庫的不同體現在使用上,靜態庫中的代碼能編譯進應用程序的exe 文件中,這個exe 文件可單獨發佈,但體積較龐大。 動態庫可讓exe 文件執行時加載,雖然exe 文件體積小了,但發佈時必須帶著相應的動態庫文件。
2) VC 編譯還可用VC++ 打開D:\wxWidgets-2.8.7\build\msw\wx.dsw,然後選擇Build->Batch Build... ,我們看到每個工程都有16 個配置,請根據應用需求勾選你的配置,如所有工程的Win32 Release 和Win32 Debug 版本,然後Build,如果你照單全收,編譯將非常耗時而佔空間。 這種編譯方式就是可以一下操作幫你編譯出所有需要的版本。
好,等等編譯完之後,在目錄D:\wxWidgets-2.8.7\lib\ 會有產生一個目錄:vc_lib 是靜態庫的目錄,默認編譯有17 個靜態。 如果是編譯成動態庫則會產生目錄vc_dll。 在vc_lib 中有mswd 目錄,release 版對應的是msw,裡面含有Debug 和Release 版的setup.h。
注意到Debug 版和Release 以及和UNICODE 、動態庫、靜態庫組合條件編譯生成的文件和目錄名。
靜態庫編譯到D:\wxWidgets-2.8.7\lib\vc_lib 目錄中動態庫編譯到D:\wxWidgets-2.8.7\lib\vc_dll 目錄中文件命名為wxmsw28d_core.lib 文件為例:
wxmsw28_core.lib ---- Release,非UNICODE 版
wxmsw28d_core.lib ---- Debug,非UNICODE 版
wxmsw28u_core.lib ---- Release,UNICODE 版
wxmsw28ud_core.lib ---- Debug,UNICODE 版對於dll 文件的命名規範也一樣的。
在vc_lib 和vc_dll 下如果全編譯了會有四個目錄,msw、mswd、mswu、mswud 意義同上。
編譯完後可以把那些過程中的目標文件刪了,它們佔的空間實在是太大。 要是你還想以後重新編譯用就留著吧。
第三步:創建wxWidgets項目
創建一個Win32 Application 的空項目,項目名為wxHello
Proejct->Settings (Alt+F7) 進入項目設置
1. C/C++選項卡->Code Generation -> use run-time library設置為: Debug MutilThread DLL
2. C/C++選項卡-> PreProcessor -> PreProcessor Definitions設置加上__WXMSW__,__WXDEBUG__ ,如果是Release版,則只需加上__WXMSW__ 。
3. C/C++選項卡-> PreProcessor -> Additional include directories設置為D:\wxWidgets-2.8.7\include,D:\wxWidgets-2.8.7\include\lib\vc_lib\mswd ,這是設置附加Include 路徑。
4. Link選項卡-> Input -> Object/library modules設置加上wxmsw28d_core.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib這些Lib(沒有這四個lib comctl32.lib rpcrt4.lib winmm.lib wsock32.lib的話請加上,關鍵是前兩個)。 如果要使用wxODBC就加上 wxbase28d_odbc.lib 。
5. Link 選項卡-> Input -> Addtional library path 設置為: D:\wxWidgets-2.8.7\lib\vc_lib。
注意:編譯成不同版的執行代碼應填入相應的Additional include directories和Addtional library path。
編譯成依賴DLL的執行文件還需要加上預處理指令 WXUSINGDLL
用 UNICODE編譯則需要加上預處理指令 _UNICODE
還有一種 Universal 編譯,要加上預處理指令 __WXUNIVERSAL__
這樣一個普通的WxWdigets項目就設置好了.
我們測試WxWidgets 自帶的例子minimal。 新建一個minimal.cpp 文件,內容同D:\wxWidgets-2.8.7\samples\minimal\minimal.cpp,編譯,不出意外,成功了!
也可設置全局的目錄
前面我們是為項目配置Additional Include Directories 和Additional library path。 我們可以把這設置成全局的。 就可以不用在項目中單獨設置。 全局設置有其缺陷,無法分開是vc_lib 還是vc_dll 中的lib,是mswd 還是msw 中的wx/setup.h 文件。 在這裡設置Source Files 還是必要的。 並且在下面前兩個Include Files 放在全局設置裡也較合適。
進到VC++ 的 Tools->Options->Directories,選擇"Include Files" 後,添加
D:\wxWidgets-2.8.7\include
D:\wxWidgets-2.8.7\contrib\include
D:\wxWidgets-2.8.7\lib\vc_lib\mswd
對應於Project Settings -> C/C++ Tab->Preprocessor 中的Additional include directories
再選擇"Libraries Files",添加
D:\wxWidgets-2.8.7\vc_lib
對應於Project Settings -> Link Tab -> Input 中的Additional library path
再選擇"Source Files",添加
D:\wxWidgets-2.8.7\src
最後大致比較一下生成程序的大小
Release 靜態庫版(vc_msw) minimal.exe 1.11M,可單獨發佈
Debug 靜態庫版(vc_mswd) minimal.exe 2.52M,可單獨發佈
Release 動態庫版(vc_mswdll) minimal.exe 68K,加上wxmsw28_core_vc_custom.dll (2.85M) 和wxbase28_vc_custom.dll (1.11M),共4M
Debug 動態庫版(vc_mswddll) minimal.exe 96K,加上wxmsw28d_core_vc_custom.dll (4.26M) 和wxbase28d_vc_custom.dll (1.82M),共6.1M
這是一個簡單的wxWidgets 程序,只用到了兩個動態庫的情況。 在用到wxWidgets 庫較少時用靜態庫來編譯發佈文件會小一些,若是用到組件多的時候,可能用動態庫方便些,請酌情決定。
參考:1. C++開源跨平台類庫集
2. wxWidgets-2.8.3編譯和在VC中的配置
3. vc++6.0下wxWidgets程序開發環境的設置
4. 在Visual C++ 6中配置wxWidgets項目
5. 如何調用DLL (基於Visual C++6.0的DLL編程實現)