最近對wxWidgets產生了興趣,想用用這個東西. 本來用VC6環境來對wxWindows進行配置,是最簡單不過的了. 但我想到這個東東既然是可以在Linux下run的東西, 還是用MinGW下來使用他吧. 乘這個機會也學點gcc的使用. 經過一兩天的摸索, 總算搞定. 一. 準備工作 wxWidgets2.6.2: 可以到www.wxWindows.org下載. 建議下載所有平台版(All ports combined )的.這樣在linux下也可以編譯使用. MinGW(5.02): 我下載的是一個網路安裝版的. 使用網路安裝版時建議下載所有組件(花不了多少時間,看了下就9個包左右). MYSYS1.0.11: Windows下一個仿Linux環境, 在編譯wxWidgets時需要它. 以上兩個包最新的可以到 sourceforge.net 上去查詢. 下面是我用的. MinGW: http://umn.dl.sourceforge.net/sourceforge/mingw/MinGW-5.0.2.exeMYSYS: http://superb.dl.sourceforge.net/sourceforge/mingw/MSYS-1.0.11-2004.04.30-1.exe Dev-C++: 我使用的是最新的4.9.9.2版本. (按:用了這麼多的IDE,發現還是MS 的Visual Stdio系列的IDE最好用. 雖然有很多開源的IDE,但大多使用起來不是太方便,Dev-C++算用起來比較順手的一個. 另外 MinGW Developer Studio也不錯. 難怪在Linux下眾多高人們還是情願使用VIM和Emacs.) 二. 安裝 分別安裝MinGW,MYSYS,Dev-C++到系統上. 安裝時一路下一步就OK了. 另外在安裝Dev-C++時值得提請注意的是,它會提示是否要跟系統的.c,.cpp等檔案相關. 如果你不想這樣,最好去掉這些選項. 三. 編譯wxWidgets 先將wxWidgets解壓縮到硬碟上.我機器上為d:/wx. 運行mysys,進入wx目錄( cd /d/wx ). 建立兩個目錄build_d,build_r分別用來編譯Debug版的庫和發布版的庫. 先建立Debug版的庫. cd build_d 回合組態命令: ../configure --with-msw --enable-debug --enable-debug_gdb --disable-shared --enable-monolithic (說明: --with-msw 表示編譯ms window的版本, --enable-debug 和 --enable-debug_gdb 標準表示配置debug版的庫. --disable-shared 將編譯靜態庫. wxWidgets的作者建議使用靜態庫,這樣在將來的應用程式升級時就方便些,因為不用在重複發布那麼多的dll了. --enable-monolithic將把wxWidgets的核心庫編譯到一個庫檔案. 這樣做的好處時就是比較省事) 等配置完成後,就可以運行 make 進行編譯了. 編譯時間跟你機器效能相關. 編譯完成後,運行 make install 可以把已經裝好的庫安裝到mysys的環境中.這一步在windows下並不一定要做.因為我們並不一定會在mysys下來開發. 在運行make install 後,為了驗證安裝是否成功,可以編譯一下wx內建的sample來看看. (當前路徑為/d/wx/build_d) cd sample/minimal make 如果編譯成功, 則表示安裝完成了. 可以運行 ./minial.exe 看看效果 在這裡我建議建立一個目錄,把庫都拷貝出去,方便以後搭建dev-C++的環境. 下面是我的操作. (當前路徑為 /d/wx/build_d) mkdir /d/wxlib cp -R -u lib /d/wxlib 將庫檔案拷貝出去備份. 接下來是編譯Release版. (當前路徑為/d/wx/build_d) cd ../build_r ../configure --with-msw --disable-shared --enable-monolithic (此處去得了debug標誌,則預設按Release版編譯) make cp -R -u lib /d/wxlib 四. 配置Dev-C++ 假設Dev-C++的安裝目錄為 d:/dev-cpp. 在 d:/dev-cpp/lib下建立一個目錄 wx. 將我們備份目錄(d:/wxlib)下所有的.a檔案拷貝到這個目錄下. 將wxWidgets解壓縮目錄下include目錄下的wx檔案夾全部拷貝到d:/dev-cpp/include下. 同時將d:/wxlib/wx/include下msw-ansi-debug-static-2.6 目錄 和 msw-ansi-release-static-2.6 目錄拷貝到 d:/dev-cpp/include/wx目錄下. 下面我們要自己編輯一個wx專用的setup.h檔案. 在d:/dev-cpp/include/wx下產生一個setup.h檔案. 內容編輯如下: #ifndef _SETUP_H_
#define _SETUP_H_ # ifdef __WXDEBUG__
# include "./msw-ansi-debug-static-2.6/wx/setup.h"
# else
# include "./msw-ansi-release-static-2.6/wx/setup.h"
# endif #endif 五. 編輯dev-c++的工程模版檔案. 因為dev-c++目前不支援像MinGW Devoleper Studio那樣可以配置Debug和Release模式,所以我們編輯兩套模版. 一套用於Debug版,一套用於Release版. 在dev-c++的安裝目錄下建立三個檔案: wxWindow_Debug.template,wxWindow_Release.template, StdPrec.h(這是用來作先行編譯的標頭檔)分別編輯檔案如下wxWindow_Debug.template[Template]
ver=1
Name=wxWindows-Debug
Icon=wxWindow.ico
Description=wxWidgets development[Debug]
Catagory=GUI [Unit0]
CppName=StdPrec.h
Cpp=StdPrec.h [Project]
UnitCount=1
Type=0
Name=wxWindowCppCompiler=-D_X86_=1 -DWIN32 -D_WIN32 -DWINVER=0x0400 -D__WIN95__ -D__GNUWIN32__ -D__WIN32__ -DSTRICT -D__WXMSW__ -D__WINDOWS__ -D__WXDEBUG__ -fpch-deps -g
Linker=-pipe -Wl,--subsystem,windows -mwindows -lwx_mswd-2.6 -lwxregexd-2.6 -lwxpngd-2.6 -lwxjpegd-2.6 -lwxzlibd-2.6 -lwxtiffd-2.6 -lstdc++ -lgcc -lodbc32 -lwsock32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lctl3d32 -lodbc32 -ladvapi32 -lodbc32 -lwsock32 -lopengl32 -lglu32 -lole32 -loleaut32 -luuid (wxWindow.ico可以在wxWindow的解壓縮目錄下的Sample目錄獲得,然後拷貝到 template目錄下即可)wxWindow_Release.template[Template]
ver=1
Name=wxWindows-Release
Icon=wxWindow.ico
Description=wxWidgets development[Release]
Catagory=GUI [Project]
UnitCount=0
Type=0
Name=wxWindowCppCompiler=-D_X86_=1 -DWIN32 -D_WIN32 -DWINVER=0x0400 -D__WIN95__ -D__GNUWIN32__ -D__WIN32__ -DSTRICT -D__WXMSW__ -D__WINDOWS__ -fpch-deps
Linker=-pipe -Wl,--subsystem,windows -mwindows -lwx_msw-2.6 -lwxregex-2.6 -lwxpng-2.6 -lwxjpeg-2.6 -lwxzlib-2.6 -lwxtiff-2.6 -lstdc++ -lgcc -lodbc32 -lwsock32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lctl3d32 -lodbc32 -ladvapi32 -lodbc32 -lwsock32 -lopengl32 -lglu32 -lole32 -loleaut32 -luuid StdPrec.h#ifndef _STDPREC_H_INCLUDE
#define _STDPREC_H_INCLUDE#include "wx/wxprec.h"#ifdef __BORLANDC__
#pragma hdrstop
#endif// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWidgets headers)
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif#endif //_STDPREC_H_INCLUDE 上面的兩個模版中, Debug模式的模版會在工程建立時產生一個StdPrec.h的先行編譯標頭檔, 而在Release模式下則只會產生一個空工程.這主要是考慮到我們在開發時首先會用使用Debug模式開發,等調試完成後,我們在建立一個Release工程,然後將所有的程式檔案加入到這個建立的工程中就可以了. 現在啟動 dev-c++(我使用的是中文環境), 在工具-編譯選項中,選擇 "庫" 選項卡,將wx庫的路徑加入到庫搜尋路徑中. 我機器為 d:/dev-cpp/lib/wx. 現在我們可以開始實驗了. 我們建立一個測試目錄. d:/sample/wx 選"建立"->"工程",在出現的對話方塊中選擇"GUI"這一頁.選擇wxWindow-Debug. 如果喜歡可以自己取一個工程名.這裡就預設"工程1". 點擊確定.提示儲存工程檔案,將此檔案儲存到我們建的工程目錄下. d:/sample/wx.然後我們將建立一個main.cpp檔案加入到工程中.輸入如下代碼:(這段代碼是從wx內建的sample/minimal例子中摘下來的)#include "StdPrec.h" class MyApp : public wxApp
{
public:
virtual bool OnInit();
}; class MyFrame : public wxFrame
{
public:
MyFrame(const wxString& title); void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);private:
DECLARE_EVENT_TABLE()
};enum
{
Minimal_Quit = wxID_EXIT, Minimal_About = wxID_ABOUT
}; BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
EVT_MENU(Minimal_About, MyFrame::OnAbout)
END_EVENT_TABLE() IMPLEMENT_APP(MyApp) bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(_T("Minimal wxWidgets App")); frame->Show(true); return true;
} MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title)
{#if wxUSE_MENUS
wxMenu *fileMenu = new wxMenu; wxMenu *helpMenu = new wxMenu;
helpMenu->Append(Minimal_About, _T("&About.../tF1"), _T("Show about dialog")); fileMenu->Append(Minimal_Quit, _T("E&xit/tAlt-X"), _T("Quit this program")); wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, _T("&File"));
menuBar->Append(helpMenu, _T("&Help")); SetMenuBar(menuBar);
#endif // wxUSE_MENUS#if wxUSE_STATUSBAR
CreateStatusBar(2);
SetStatusText(_T("Welcome to wxWidgets!"));
#endif // wxUSE_STATUSBAR
}void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(true);
}void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxString msg;
msg.Printf( _T("This is the About dialog of the minimal sample./n")
_T("Welcome to %s"), wxVERSION_STRING); wxMessageBox(msg, _T("About Minimal"), wxOK | wxICON_INFORMATION, this);
} 儲存這個main.cpp檔案, 進行編譯. 如果你在link時出現錯誤, 則有可能是dev-C++ 內建的lib庫有問題. 我就遇見了這種情況. 讓我鬱悶了好半天.解決的辦法很簡單, 將MinGW5.0.2的庫檔案覆蓋dev-c++內建的庫檔案即可.即是將d:/MinGW/Lib下所有檔案包括子目錄覆蓋 d:/dev-cpp/Lib目錄. 此時再編譯, 就OK了.
作者郵箱: lizw2006@126.com 歡迎來信討論和指正.