本文部分內容轉自網路(原文連結:http://shiningray.cn/windows-shang-pei-zhi-codeblocks-wxwidgets.html),並在原文的基礎上簡化敘述,擴充內容以適應當前軟體版本,並記錄了我在操作過程中的疑惑和解答,以協助更多像我這樣的菜鳥~
請先瀏覽本文,瞭解操作脈絡後再進行實踐.
本文涉及的工具介紹MinGW32
一套遵循GNU規則的編譯器和debuger工具集,免費開源,用於替代微軟的VC++系列編譯器和調試器.
Code::Blocks:
一個跨平台的C++IDE,支援Windows、Linux、MacOSX。同時還支援各種不同的編譯器,如GNU/MinGW C/C++,VC++6.0/2003/2005/2008,Borland C++,Digital Mars等等各種不同的編譯器。
最近版本為10.05,
官網:http://www.codeblocks.org/,
官網下載頁http://www.codeblocks.org/downloads/26,(請下載codeblocks-10.05mingw-setup.exe版本,)
我上傳了一個配置完成可以直接使用的mod,分成3個part:
http://download.csdn.net/source/2725048
http://download.csdn.net/source/2725067
http://download.csdn.net/source/2725128
wxWidgets:
是一個十分優秀的跨平台的GUI架構,用其編寫的C++應用程式可以十分方便地遷移到不同的系統上去。
配置code::blocks(若您下載我提供的mod可以跳過這一步)最新版的Code::Blocks
請下載最新的10.05。
wxWidgets
你可以選擇下載wxWidgets的原始碼然後自己進行構建,或者是直接安裝先行編譯的wxPack。
wxWidgets原始碼
如上述,有兩種選擇:
安裝包較小,可以根據自己的需求進行自訂構建,但是需要花費長時間進行編譯。如果不清楚編譯選項,可能導致無法成功配置Code::Blocks。
目前推薦的wxWidgets的版本是2.8.7。點擊此處下載wxWidgets 2.8.7原始碼Windows安裝包 (wxMSW-2.8.7-Setup.exe; 12.0 MB)。你也可以檢查一下wxWidgets的下載頁面看看有沒有更新的穩定版下載。強烈建議你將代碼安裝到不帶空格的路徑中。必須保證盤中至少有300MB的剩餘空間。
wxPack
雖然安裝包達200MB,全部安裝需要3G,但是包含了先行編譯的所有可能用到的庫檔案,而且包含VC和GCC的兩種版本,可以不用去考慮構建選項了。
當前wxPack的穩定發布版是 v2.8.7.03,基於 wxWidgets 2.8.7。點擊此處下載 wxPack v2.8.7.03 (wxPack_v2.8.7.03.exe, 236.9 MB)。你也可以查看wxPack下載頁面看看有沒有更新的穩定版下載。強烈建議將wxPack安裝到沒有空格的路徑中。如果你選擇只MSVC版本,應保證至少有700MB的剩餘空間;如果只選擇MinGW/GCC版本,則應保證至少有2.2GB的剩餘空間。
提示
如果磁碟使用了NTFS格式,可以開啟檔案壓縮功能,上述的目錄在壓縮後可以減少50%的空間佔用。
編譯wxWidgets
使用wxPack則可以跳過這一步。
轉到wxWidgets的構建目錄下,其中<wxWidgets>是源碼所在路徑,預設是C:/wxWidgets-2.8.7
:
cd <wxWidgets>/build/msw
執行構建命令,
MinGW/GCC推薦的命令是:
mingw32-make -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1
MSVC推薦的構建命令是:
nmake -f makefile.vc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1
這個過程需要花很久,快的機器大概30分鐘可以完成,慢的可能就需要幾個小時了。
如果使用的GCC的版本較新,構建過程中可能會出現大量的警告。這樣會明顯導致構建過程變慢;你可以將錯誤資訊重新導向到檔案中,在上述命令後面添加2> err.log
,也可以通過2>nul
直接禁止警告資訊。
其中關於BUILD、SHARED、MONOLITHIC以及UNICODE選項的解釋,請仔細參考文章後面關於wxWidgets的構建參數的解釋,這些參數十分關鍵,他們直接定義了你所使用的基本的wxWidgets開發環境。你必須嚴格按照你的編譯參數設定Code::Blocks的設定精靈。
在Code::Blocks中建立wxWidgets項目
在Code::Blocks的起始頁面中,選擇“Create a new project”,也可以在File菜單中,選擇“New” -> “Project…”。
找到並選擇“wxWidgets project”,並建立,接下來會出現一個嚮導協助進行wxWidgets項目的配置:
- 第一個頁面是簡介,可以選擇以後跳過。
- 選擇你要使用的wxWidgets版本。如果你是按照本文的過程配置的,那麼你應該選擇“wxWidgets 2.8.x”。
- 設定你的項目的名字的位置。
- 輸入作者的資訊(非必要)
- 選擇自動代碼和檔案產生的選項。
- 選擇wxWidgets的位置。強烈建議在此使用全域變數:輸入“$(#wx)”(不包含引號)。如果你還沒定義這個全域變數,那麼全域變數對話方塊會出現,在Base Path中,選擇你的wxWidgets安裝路徑。其他路徑可以不用填。
- 為你的項目選擇debug/release配置。推薦至少選擇debug配置。
- 選擇你的wxWidgets構建選項。必須和你構建wxWidgets時所使用的選項一致!如果你按照本文之前的方式構建的,應該將“wxWidgets Library Settings”下的全部三個選項選中。如果用的是wxPack,由於wxPack包含了各種不同的版本,所以你只需要選擇你需要的選項。這個頁面的另一個設定和wxWidgets的構建選項沒有關係,你可以按照喜好來選擇。如果,出於某種原因,你想使用調試版本的wxWidgets構建,選擇“Configure Advanced options”然後在下一頁選擇“Use __WXDEBUG__ and Debug wxWidgets lib”。
- 如果需要,選擇額外的庫。一般應用的話應該無須選擇其中任何一個。
構建並運行程式
接下來,就可以選擇“Build and run”(F9)對程式進行構建並運行了。如果順利,你的wxWidgets應用程式就會出現。如果出現了什麼問題,你可以參考後面的常見問題。
可視化的介面編輯
在code::blocks中可以使用wxSmith或wxFormBuilder對介面進行編輯.在我提供的code::blocks中已經整合了wxSmith,在wxWidget建立嚮導的相應步驟中進行選擇就好.當工程建立好,在檔案樹裡開啟Others -> wxSmith -> xxxx.wxs, code::blocks就會自動用wxSmith開啟進行編輯.
至於wxFormBuilder,他不像wxSmith一樣,而是作為一個程式獨立啟動並執行,感覺不如wxSmith方便.但也在這提供配置方法:
在wxWidget的建立嚮導中相應步驟選擇wxFormBuilder,其餘步驟照常.在建立好的工程後,去Settings -> Environment -> Files extension handling,在Registered wildcards下面選擇*.fbp,如果沒有話就通過New建立一個,選中後在右邊選擇Launch an external program, 直接選取你的wxFormBuilder.exe的路徑.點擊ok配置完成.
現在檔案樹下找到Others -> wxSmith -> xxxx.fbp,雙擊它,code::blocks會自動開啟wxFormBuilder.exe來進行編輯.如果想熟練使用還需要瞭解一些wxWidget的原理,與javax.swing控制項很像,在這就不多解釋了,如有需要煩請自行Google~
wxWidgets編譯選項簡介BUILD
BUILD控制wxWidgets構建調試版本(BUILD=debug)或者是發布版本(BUILD=release)。絕大多數情況下你只需要wxWidgets的發布版本就可以了,因為你應該不想要去調試wxWidgets自身,同時你依然可以通過連結wxWidgets的發布版本來構建你自己的程式的調試版本。
- 調試構建wxWidgets會建立帶有”d”尾碼的庫,例如”libwxmsw28d.a”、”wxmsw28d_gcc_custom.dll”。
- 調試構建wxWidgets會在wxWidgets庫的輸出目錄中建立”mswd” 或者 “mswud” 目錄。
- 發布構建wxWidgets建立的庫沒有”d”尾碼,例如”libwxmsw28.a”、”wxmsw28_gcc_custom.dll”。
- 發布構建wxWidgets會在wxWidgets庫的輸出目錄中建立”msw” 或者 “mswu” 目錄。
SHARED
SHARED控制wxWidgets是構建DLL(SHARED=1)還是靜態庫(SHARED=0)。利用構建的DLL,主程式構建時間較快,可執行檔更小。但是可執行檔加上wxWidgets DLL的總大小更大,但是不同的可執行檔可以使用同一個DLL。
- wxWidgets的DLL構建會建立匯入庫(如 libwxmsw28.a)以及DLL檔案(如wxmsw28_gcc_custom.dll)。你必須在發布你的程式的時候包含這個DLL。
- wxWidgets的靜態構建只會建立靜態庫(如 libwxmsw28.a),發布的時候也無須包含wxWidgets的DLL。
MONOLITHIC
MONOLITHIC控制是構建一個單一的庫(MONOLITHIC=1)還是多個組件庫(MONOLITHIC=0)。使用單一構建,項目的設定和開發會更加簡單,如果你同時使用DLL構建的話,你只需要分發一個DLL檔案。如果使用非單一構建(multilib),會構建出多個不同的庫同時你可以避免將整個wxWidgets的基本代碼連結到主程式,就可以去掉不需要的庫。同時你也必須確保你選擇了正確的組件庫。
- wxWidgets的單一構建僅會建立一個wxWidgets匯入庫(如libwxmsw28.a)以及一個DLL(如wxmsw28_gcc_custom.dll)。
- wxWidgets的多庫(multilib)構建會建立多個匯入庫(libwx28_base.a等)以及多個DLL檔案。
- 無論何種wxWidgets構建,都會建立額外的靜態庫(如libwxexpat.a、libwxjpeg.a等)。這些庫對於wxWidgets的DLL構建一般是不需要的,但是當使用靜態構建的時候,則是必須的。
UNICODE
UNICODE控制wxWidgets以及你的程式是否使用支援Unicode的寬字元串。大多數Windows 2000或更高系統上的應用程式都應該支援Unicode。早期的Windows版本不一定有Unicode支援。你應該總是使用wxWidgets的_("string")
和_T("string")
宏來確保硬式編碼字串編譯時間是正確的類型。
- wxWidgets的Unicode(UNICODE=1)構建將會建立帶有”u”尾碼的庫,例如”libwxmsw28u.a”、”wxmsw28u_gcc_custom.dll”。
- wxWidgets的Unicode構建會在wxWidgets庫的輸出目錄中建立”mswu”或”mswud”目錄。
- wxWidgets的ANSI(UNICODE=0)構建建立的庫沒有”u”尾碼,例如”libwxmsw28.a”、”wxmsw28_gcc_custom.dll”。
- wxWidgets的ANSI構建會在wxWidgets庫的輸出目錄中建立”msw”或”mswd”目錄。
常見問題出現類似於”wx/setup.h: No such file or directory”的錯誤
你在構建選項中缺少了很重要的編譯器搜尋路徑。首先確認你是否在運行wxWidgets項目嚮導的時候正確選擇了wxWidgets的構建配置。如果重新運行嚮導並配置依然無效,那麼開啟你的項目的構建選項並給編譯起的搜尋路徑中添加”$(#wx.lib)/gcc_dll/mswu
“(這裡假設是一個單一的Unicode DLL構建)。
出現類似於”cannot find -lwxmsw28u”的錯誤
構建選項中的連結庫錯了。首先確認你是否在運行wxWidgets項目嚮導的時候正確選擇了wxWidgets的構建配置。如果重新運行嚮導並配置依然無效,確定你構建了什麼庫,並相應在構建選項中調整庫的名字。