一直在尋找一個(gè)方便使用的C++GUI庫(kù)。今天終于把WxWidgets搞定。
大致的步驟是四步:
第一步,Eclipse及CDT的安裝
第二步,MinGW及編譯器的安裝配置
第三步,wxWidget的下載及編譯
第四步,Eclipse下有關(guān)wxWidget的配置
搞定wxWidget的配置、開(kāi)始編寫(xiě)像樣的windows程序
----Richard Lee 回味
看了網(wǎng)上的絕大部分文章,多半解決不了什么問(wèn)題,還有可能誤入歧途,浪費(fèi)更多的時(shí)間在前期這準(zhǔn)備工作上。
所以,把這些配置的詳細(xì)步驟寫(xiě)出來(lái),希望能為后來(lái)者指點(diǎn)迷津,切莫再花時(shí)間再環(huán)境的搭建上了。
大致的步驟是四步:
第一步,Eclipse及CDT的安裝
第二步,MinGW及編譯器的安裝配置
第三步,wxWidget的下載及編譯
第四步,Eclipse下有關(guān)wxWidget的配置
經(jīng)過(guò)這四步相信你就應(yīng)該可以正常調(diào)試你的窗口程序了。
ok,我們開(kāi)始。
第一步 Eclipse及CDT的安裝
這步其實(shí)沒(méi)啥說(shuō)的,是最簡(jiǎn)單的一步,用過(guò)eclipse及安裝過(guò)插件的人都應(yīng)該很快搞定。
下載Eclipse最新版本,到我寫(xiě)這篇文章時(shí)應(yīng)該是3.2版,由 http://www.eclipse.org 下載,當(dāng)然首先你要先下載JDK并正確安裝和注冊(cè)環(huán)境變量path(將你的jre的bin目錄路徑cut到path里),再啟動(dòng)Eclipse 應(yīng)該看到正常啟動(dòng)畫(huà)面。
再到eclipse的網(wǎng)站上找到CDT,下載它,當(dāng)然你應(yīng)該選擇最近的版本下載。
下載后,進(jìn)行解壓,并直接將解壓后得到的諸多文件及文件夾 Copy到Eclipse原目錄下。重新啟動(dòng)Eclipse,這時(shí)再新建工程,你應(yīng)該能見(jiàn)到 C/C++工程這項(xiàng)了。
到這里,你的CDT算是安裝成功了。
第二步 MinGW及編譯器的安裝配置
這部分主要是MinGW的下載及安裝配置。
由于單獨(dú)的Eclipse + CDT 是不能完成C++工程開(kāi)發(fā)的,因?yàn)橹辽龠€缺少編譯器及基礎(chǔ)類(lèi)庫(kù),這里我們選擇MinGW工具,你需要到 http://www.MinGW.org 上去下載最新版本的MinGW。
到目前為止,最新版本是5.0.2版,你從它網(wǎng)站上直接download下來(lái)的應(yīng)該是一個(gè)100多k的下載端軟件,還需要繼續(xù)下載全部?jī)?nèi)容,運(yùn)行該下載文件后,按要求逐步推進(jìn),如果你是下載壓縮包,即只下載需要的部分,那么你選擇下載以下這幾部分
- gcc-g++-3.4.2-20040916-1.tar.gz
- gcc-core-3.4.2-20040916-1.tar.gz
- mingw32-make-3.80.0-3.tar.gz
- mingw-runtime-3.9.tar.gz
- mingw32-make-3.80.0-3.tar.gz
- binutils-2.15.91-20040904-1.tar.gz
- w32api-3.6.tar.gz
下 載完成后,首先將他們拷貝到同一目錄下,并將它們解壓在同一目錄下面(例如我的mingw安裝目錄是c:\mingw,那么需要將這7個(gè)壓縮文件全部直接 在c:\mingw解壓)。然后設(shè)置環(huán)境變量確保在PATH環(huán)境變量中包含"d:\mingw\bin",最后可以打開(kāi)DOS控制臺(tái)輸入gcc來(lái)驗(yàn)證環(huán)境 變量是否設(shè)置正確。如果你的DOS控制臺(tái)顯示“no input file”等相關(guān)信息,那么你這一步也算完成了。
第三步,wxWidget的下載及編譯
wxWidget由 http://www.wxWidgets.org 下載并安裝,目錄自選。
安裝好后,直接進(jìn)入你wxWidgets的安裝目錄 (舉例:c:\wxWidgets-2.8.0\build\msw)中,在這里執(zhí)行命令
mingw32-make -f makefile.gcc BUILD=release SHARED=0 UNICODE=1 USE_ODBC=1
通過(guò)makefile.gcc 這個(gè)文件將整個(gè)項(xiàng)目編譯好,你會(huì)等很久大約半個(gè)多小時(shí),編譯后目錄漲到800多M,因?yàn)橐徊糠质?o的中間文件,
可以刪除。
編譯后你會(huì)在安裝目錄的(c:\wxWidgets-2.8.0\lib\gcc_lib)下看到一堆擴(kuò)展名為 .a 的Archive文件(windows下的庫(kù)文件為.lib
linux下為 .a)和幾個(gè)目錄,類(lèi)似mswu,mswud。
第三步完成。
第四步,Eclipse下有關(guān)wxWidgets的配置
首先啟動(dòng)你的Eclipse并建立一個(gè)Managed C++ Project。創(chuàng)建完成后右鍵該項(xiàng)目并選擇"Properties"屬性對(duì)話框在其中選擇“C/C++ Build"選項(xiàng)。
在C/C++Build選項(xiàng)界面中,選擇“Configuration Settings”的"Tool Settings“。
在Tool Settings中選擇"GCC C++ Compiler"->"Preprocessor",
在Defined symbols列表中加入:__WXMSW__ (注意,兩側(cè)都是雙下劃線), __WXDEBUG__ 和 _UNICODE(此處是單下劃線,
因?yàn)槟愕膚xWidgets是用unicode編碼編譯的,所以此處一定要設(shè)置該宏,不然在編譯時(shí)會(huì)收到大量"undefined reference")。
接下來(lái)你需要選擇Directories項(xiàng)并添加include及l(fā)ib目錄,在這里你需要添加
"C:\wxWidgets-2.8.0\lib\gcc_lib\mswud"
"C:\wxWidgets-2.8.0\lib\gcc_lib\mswu"
"C:\wxWidgets-2.8.0\include"
"C:\wxWidgets-2.8.0\contrib\include"
這四個(gè)目錄進(jìn)Directories。
接下來(lái)在下面的 Miscellaneous 選項(xiàng)中的Other Flags中輸入以下這句
-c -Wundef -Wno-ctor-dtor-privacy -fno-strict-aliasing
接下來(lái)點(diǎn)選到 "GCC C++ Linker" 部分。在這部分,首先選擇"Libraries"并在右側(cè)的Libraries欄中按順序鍵入以下庫(kù)名:
wxmsw28ud_xrc,wxmsw28ud_richtext, wxbase28ud_net, wxmsw28ud_dbgrid, wxbase28ud_odbc,wxmsw28ud_media, wxmsw28ud_aui, wxmsw28ud_html, wxmsw28ud_adv,wxbase28ud_xml, wxmsw28ud_core, wxbase28ud, wxtiffd, wxjpegd, wxpngd,wxzlibd, wxregexud, wxexpatd, kernel32, user32, gdi32, comdlg32,winspool, winmm, shell32, comctl32, ole32, oleaut32, uuid, rpcrt4,advapi32, wsock32, odbc32
庫(kù)名全部加入后在下面一欄的"Library search path (-L)"中加入以下目錄
"C:/wxWidgets-2.8.0/lib/gcc_lib"
"C:/wxWidgets-2.8.0/lib"
添加完成后,選擇該部分中的"Miscellaneous"項(xiàng),并在"Linker flags"中鍵入
-Wl,--subsystem,windows -mwindows
此時(shí),點(diǎn)擊應(yīng)用。
再切換到"Build Settings"標(biāo)簽頁(yè),勾掉"Build Command"中的,"Use default command"前的勾兒,并將命令 make 改為
mingw32-make -fmakefile
最終,點(diǎn)擊"OK"使設(shè)置生效。
到這里,你可以把wxwidgets中的samples拿來(lái)試一試了,把代碼Copy進(jìn)你的工程,編譯運(yùn)行一下,看看結(jié)果。
我想,你應(yīng)該成功了。。。。
下面是第一個(gè)WxWidgets程序的代碼:
#include "wx/wx.h"
using namespace std;
class MyApp:public wxApp
{
??? public:
??? vrtual bool OnInit();
};
class MyFrame:public wxFrame
{
public:
??? MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) ;
??? void OnQuit(wxCommandEvent& event);
??? void OnAbout(wxCommandEvent& event);
??? DECLARE_EVENT_TABLE()
};
enum
{
??? ID_Quit = 1,
??? ID_About,
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
??? MyFrame *frame = new MyFrame( wxT("Hello World"), wxPoint(50,50), wxSize(450,340) ) ;
??? frame->Show(TRUE);
??? SetTopWindow(frame);
??? return TRUE;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
??? ??? ??? : wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
??? wxMenu *menuFile = new wxMenu;
??? menuFile->Append( ID_About, wxT("&About...") ) ;
??? menuFile->AppendSeparator();
??? menuFile->Append( ID_Quit, wxT("E&xit") ) ;
??? wxMenuBar *menuBar = new wxMenuBar;
??? menuBar->Append( menuFile, wxT("&File") ) ;
??? SetMenuBar( menuBar ) ;
??? CreateStatusBar();
??? SetStatusText( wxT("Welcome to wxWindows!") ) ;
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
??? Close(TRUE);
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
??? wxMessageBox(wxT("This is a wxWindows Hello world sample"),
??? wxT("About Hello World"), wxOK | wxICON_INFORMATION, this) ;
}
注:??
編譯wxWigets時(shí)候mingw32-make -f makefile.gcc BUILD=release SHARED=0 UNICODE=1 USE_ODBC=1
??? SHARED = 0 表示 靜態(tài)編譯;SHARED =1 表示動(dòng)態(tài)編譯
??? USE_ODBC=1 是默認(rèn)的(可設(shè)置為0)??? :使用ODBC數(shù)據(jù)庫(kù)
??? USE_GL = 1 是默認(rèn)的(可設(shè)置為0)??? ?? :使用OpenGL庫(kù)
??? 詳細(xì)編譯選項(xiàng)見(jiàn)<wx/setup.h>
??? 如果采用動(dòng)態(tài)編譯,Defined symbols(
預(yù)定義?)
中必須定義WXUSINGDLL,如果為Debug版本還得添加MinGW的運(yùn)行時(shí)庫(kù)mingwm10.dll。
??? 上面提到的:如果編譯Debug版本,需要定義__WXDEBUG__;Release版本則不需要。
下圖是:上面的代碼,在vista 下動(dòng)態(tài)編譯的Debug 版本