2020年1月15日 星期三

打造在 Win10 的 C++ 編譯環境

此文有點像廢文,因每人須求不同,所以做法也不一樣,所以只能說給大家作為參考。

這裡用的編譯器是 MinGW 系列,可到這裡下載,至此文發佈時間為止,提供了如下最新的版本:
▲MinGW 各版本列表

名稱標示有其特定的意義:
  • x86_64 表示編譯出來的程式為 64 位元程式碼
    i686 就表示為 32 位元。
  • posix 表示有提供 thread 相關的功能,否則就沒有。
  • sjlj、seh 及 dwarf 是對異常處理(exception)內部所採用技術的不同,不過就程式設計的使用方式並無不同,這些技術我沒研究,有興趣自己找資料囉。
就我須求來說,至少須能達到以下目標:
  1. 能用於 Code::Block 及 Visual Studio Code
  2. 能使用 CxxlMan2 程式庫
  3. 能使用 wxWidgets
因 CxxlMan2 程式庫須用到 thread 相關的功能,所以必須選擇有 posix 標識的版本,CxxlMan2 程式庫起初是在 32 位元上開發,是不是能用於 64 位元還有待檢驗。所以就只能選用 i686-posix-sjlj 和 i686-posix-dwarf

不管選用哪個編譯器,要把編譯器的所在路徑正確加入系統的 PATH 環境變數中,假設把 i686-posix-sjlj 解壓到 C:\i686-8.1.0-release-posix-sjlj-rt_v6-rev0,完整的編譯器的所在路徑即為 C:\i686-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw32\bin,下圖為在 Win10 設定 PATH 的完整程序:
設定 PATH


到這裡抓最新版的 Code::Blocks http://www.codeblocks.org/downloads/26 ,不用抓取含有 MinGW 的版本,安裝完成後有三個地方須要設定。

第一個地方:選單 Settings->Compiler->Compiler settings->Compiler Flags,設定 -std=c++11,雖然有更高的標準可選,但 CxxlMan2 程式庫是以此為準,所以就配合它。

第二個地方:選單 Settings->Compiler->Toolchan executables

1. 依選用的 MinGW 做修改。
2. 32 位元版本和 64 位元版本名稱會有不同。

第三個地方:選單 Settings->Debugger->GDB/CDB debugger->Default->Executable path ,要指定完整的 gdb.exe 檔名路徑,比如 C:\x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0\mingw64\bin\gdb.exe


到這裡抓最新版的 wxWidgets https://www.wxwidgets.org/downloads/ ,有兩種選擇,一種是直接抓已為 Windows 系統編譯好的版本,另一種則是抓原始檔下來自己編譯。

先看看抓已為 Windows 系統編譯好的版本的做法,如下圖依序打開下載選擇視窗

此示範下載 Header Files 及 32 位元的 Development Files ,至於 Release DLLs
是你寫好的程式發佈時,放到主程式所在資料夾中一併發佈的 DLL 檔。

將 Development Files 解壓到一個資料夾,此範例是解壓到 C:\wxMSW-3.1.3_gcc810_x86_Dev,同樣把 Header Files 解到此資料夾,如下圖




進到 lib 把 gcc810_dll 改名為 gcc_dll。



接著還要到 Code::Clocks 做一下設定,選單 Settings->Global Variable 中設一個 wx 變數,其 Base 設為 C:\wxMSW-3.1.3_gcc810_x86_Dev,如下圖





然後就可以建個簡單的專案來跑跑看
▲專案名稱和位置
這裡隨自己意思自己填
我比較習慣用 wxSmith 這套輔助建製工具
內定會取 wx 變數來用
鼠標所指打勾
鼠標所指若打勾,以 Debug 模式編譯時會選用 debug 版的 wxWidGets dll,否則就算以 Debug 模式編譯仍會選用 release 版
除了未點選那三個其它全選



這樣就產生了一個簡單的 wxWidGets 程式,試著編譯和跑看看,若有問題也試著除錯看看,若問題是出在和你所用的 MinGW 版本不合,試著用另一版本看看,若還是不行只好抓原始檔下來自己編譯。

我抓下來的原始檔名是 wxWidgets-3.1.3.7z ,因我要用 i686-8.1.0-release-posix-sjlj-rt_v6-rev0 這個版本來做編譯示範,所以將它解壓到 "C:\wxWidgets-3.1.3_gcc810_Dev(i686-8.1.0-release-posix-sjlj-rt_v6-rev0)" 這個資料夾。你可做好幾個採用不同的 MinGW 版本,只要修改 Windows 的環境變數 PATH 到你要用的編譯器就行了。

現在進到 C:\wxWidgets-3.1.3_gcc810_Dev(i686-8.1.0-release-posix-sjlj-rt_v6-rev0)\build\msw 這資料夾,找個空白處,按住 Shift 鍵 + 滑鼠右鍵開啟選單,打開 PowerShell 視窗




編譯指令 mingw32-make -j6  -f makefile.gcc BUILD=release SHARED=1 UNICODE=1


這樣會編譯出 Release 版的 wxWidgets ,其中 -j6 參數視你電腦能用多少執行緒來跑而定,這個參數能大大減少編譯時間,我的 CPU 是 4 核 8 緒,設超過 6 就不能跑了。


編譯 Debug 版的指令為 mingw32-make -j6  -f makefile.gcc BUILD=debug SHARED=1 UNICODE=1

若要重新編譯須先清除先前的編譯,分別先下 

mingw32-make -j6  -f makefile.gcc BUILD=release SHARED=1 UNICODE=1 clean
mingw32-make -j6  -f makefile.gcc BUILD=debug SHARED=1 UNICODE=1 clean

不過這個自行編譯的版本會有一個問題,創造測試專案編譯時會出現如下的錯誤訊息

我的解決辦法是把出錯那一行先註解掉,等真須要時再解開,為什麼會出這種錯誤我也不清楚


















沒有留言:

張貼留言