QT號稱它是跨平台開發語言,當然要試試看它是否真的那麼厲害可以不用改程式就可以編譯出在不同平台上執行的程式
啟稿: 2014/12/13
完稿: 2014/12/17
QT CueTai線索台
QT跨平台實作01-跨平台實作初探:包括Windows、OSX、iOS、Android下之實例
既然QT號稱它是跨平台開發語言,當然要試試看它是否真的那麼厲害可以不用改程式就可以編譯出在不同平台上執行的程式。
l 初始確定
首先你要先確定你所安裝的開發程式可以編譯出哪些平台上執行的程式,這也取決於你是在何種作業系統下開發;目前QT 5.3.0支援Windows、Ubuntu Linux和Mac OS作業系統下開發,可以編譯出的平台執行程式有以下:
- Desktop (Windows, Ubuntu Linux, Mac OS…)
- Android
- BlackBerry 10
- Generic remote Linux
- iOS
- QNX
- Windows Runtime (including Windows Phone)
下表顯示各個作業系統可開發出何種平台的執行程式:
Target Platform |
Linux |
Mac OS X |
Windows |
Android |
Yes |
Yes |
Yes |
BlackBerry 10 |
Yes |
Yes |
Yes |
Generic Remote Linux |
Yes |
Yes |
Yes |
iOS |
No |
Yes |
No |
QNX |
Yes |
Yes |
Yes |
Windows Runtime |
No |
No |
Yes |
並不是你在Mac OS X安裝了QT就可以編譯出上表Android, BlackBerry, Remote Linux, iOS and QNX所有的程式,事實上在官網提供了各種組合套餐組的開發平台安裝程式,例如qt-opensource-mac-x64-android-ios-5.3.0.dmg就是Mac OS作業系統下的開發程式,可以開發出Mac OS, Android, iOS平台上的程式,而qt-opensource-windows-x86-android-5.3.0.exe則是Windows作業系統下的開發程式,可以開發出Windows, Android平台上的程式。
在此我們目標是做出可以跨Windows、OSX、iOS、Android下之實例,所以我們必須準備一台Windows NB安裝qt-opensource-windows-x86-android-5.3.0.exe,另外再準備另外一台Mac Book安裝qt-opensource-mac-x64-android-ios-5.3.0.dmg。至於其他編譯該裝的核心軟體如Mac上該裝Xcode, ADT及相關軟體JDK, NDK, Ant等,因為這方面的資訊相當的多,請自行上網搜尋有關QT初始安裝過程等相關資訊。
l 初探QT Example
QT提供了相當多跨平台的Examples,在此我們以analogclock當作實例來看QT跨平台的功力。
在Windows或Mac OS X的作業系統下開啟QT,在範例中輸入”clock”,即可看到QT提供多種與clock有關的範例,在此你可選擇Analog Clock Example或Analog Clock Window都可以在Windows、OSX、iOS、Android四種系統編譯成功。
維持default的設定就應該是Configuration為Desktop MinGW 32bit即是編譯成可在Windows上執行之程式,畫面如下:
l Windows上執行
先不急著說明建置步驟,我們待會再探討建置步驟,先試著執行看看結果;在Windows上執行的結果如下:
l Android上執行
若要編譯出在Android下可以執行的程式,則就需要再增加另外Android的設定,可按Add Kit,若為Andrioiid 3.0以下的版本,可以選取 Andorid for armeabi若為Andrioiid 3.0以上的版本,可以選擇Andorid for armeabiv7a設定。至於如何增加可編譯Kits選項,請自行上網搜尋有關Android AVD Manager,並在”選項”(Options)之”Android”頁次增加新的Kits選項。
在編輯區檢查analogclock.pro,因為它是編譯的腳本定義的地方;但在此會發現檔內並沒有任何與跨平台相關的設定,因為真正與不同平台編譯相關的其實是在”設定”之建置步驟中定義!
我們來探討建置步驟;在Desktop MinGW 32bit Kits建置步驟主要是qmake與make來決定編譯輸出之平台程式,因為要產生Windows XP之程式,所以qmake與make設定如下:
若切換成Android,則建置步驟就變成下面之參數:
差異就在qmake後方的參數在Windows為-spec win32-g++,而在Android為-spec android-g++;但是換成Android在執行時會先跳出”Select Android Device”,我在此模擬Android 2.3.4所以選擇API 10;至於下圖所列出的相容裝置,請自行在Android AVD上定義!
在模擬器上執行的結果如下:
若要在實際的裝置上執行,可採用USB連結裝置到電腦上,直接QT選擇該裝置在上頭執行,不過我還沒有是成功過;另外的方法就是當你用USB連結裝置到電腦上當作USB硬碟,將下列檔案拷貝到裝置中!
C:\Qt\Qt5.3.0\Examples\Qt-5.3\widgets\widgets\build-analogclock-Android_for_armeabi_GCC_4_8_Qt_5_3_0-Release\android-build\bin\QtApp-debug.apk
在裝置中執行安裝QtApp-debug.apk,執行的結果如下:
l MAC OS X執行
要開發出Mac OS, iOS平台上的程式,就要準備另外一台Mac Book安裝QT及相關軟體;同樣的在範例中輸入”clock”,選擇Analog Clock Example,Configure default就是編譯出MAC OS的Desktop QT 5.3.0 clang 64bit設定。
仔細查看Desktop QT 5.3.0 clang 64bit Kits建置步驟其中qmake與make,要產生MAC OS的程式,所以qmake與make設定如下:
差異就在qmake後方的參數在MAC OS為-spec macx-clang CONFIG +=x86_64。
在MAC OS上建置執行結果的結果如下:
註: 若在編譯時出現問題,可以檢查編譯過程所出現的錯誤訊息並參考本文最後的結論;若Xcode版本不夠新,將無法配合QT v5.3.0 所需的設定而產生錯誤,只要更新版本就可以解決問題。
l iOS上執行
若要編譯出在iPhone/iPad iOS下可以執行的程式,則就需要再增加另外iphonesimulator的設定,可按Add Kit增加一個設定如下:
仔細查看iphonesimulator-clang QT Kits建置步驟其中qmake與make,要產生iOS的程式,所以qmake與make設定如下:
差異就在qmake後方的參數在MAC OS為-spec macx-ios-clang CONFIG +=x86。
在iOS模擬器上建置執行結果的結果如下:
l 結論
經過四個作業系統平台的實驗,QT真如同它所號稱的跨平台開發語言;而且內部所附的大部分Example都支援跨多個平台,因為架構精簡,所以一定可以編譯執行。
但要是編譯時出了問題,很多情況是安裝不齊或所需支援的底層編譯器版本問題,如同我前面所註,本人就碰到Xcode版本不夠新,編譯時產生錯誤訊息看似風馬牛不相及如下:
symbol(s) not found for architexture i386
但Google找到的網文很多是QT前版本不夠完善發生的相同錯誤訊息,但解決的方法則相當深層且複雜,但其實隨著QT版本更新其實已經解決,只是必須配合新版本的Xcode或是Visual Studio 20xx就可以了!
若是編譯完後在執行上出現問題,很多情況是硬體規格不對造成的,尤其是Android行動裝置;因為QT為Android所編譯出來的程式相當的大,簡單一個程式大小就接近10MB,所以常見是模擬器或實體的記憶體不足造成程式無法執行,在此只要解安裝部分程式釋放出記憶體就可以了。
l 延伸應用及問題
若現在想要將這個時鐘變成自訂規律時間的提醒報時鐘,跨平台還是如此容易嗎?
留言列表