利用Windows Qt 撰寫 Raspberry Pi 的程式 (toolchain)
此教程為 Sysprogs 網站之教程翻譯版本,僅後半段設定 QtCreator 部分有所不同,原文網址在此,因為 Raspberry Pi 名稱很長,故文章中一律以 RPi 簡稱之。
安裝 Raspberry Pi Toolchain 以及 MinGW32 Toolchain
- 下載 Windows toolchain for Raspberry/PI 並安裝,安裝設定記得勾選 ALL users,此範例安裝版本為 GCC 4.9.2 2015-11-21-raspbian-jessie。
- 下載 Prebuilt GNU toolchain for mingw32 並安裝,安裝設定記得勾選 ALL users,此範例安裝版本為 Binutils 2.24 GCC 4.8.1 GDB 7.6.1。
- 下載並安裝 Python 2.7 for Windows 並確認檔案有被家道系統變數 PATH 中。
- 下載 Qt 原始碼,檔名為 qt-everywhere-opensource-src-X.X.X.tar.xz 的皆可,此範例中使用的版本為 5.5.0。
同步函式庫檔案
在編譯 Pi 版本的 Qt 以前,我們要把 Pi 的函式庫同步到 Windows 的電腦上,以確保編譯出來的 Qt 可以在 RPi 上執行,我們可以使用 RPi toolchain 提供的 UpdateSysroot.bat 工具來同步,檔案位置位於安裝目錄下的TOOLS資料夾中。
Note: 同步選項中 /opt
資料夾一定要同步到,因為 Qt 所需的 OpenGL相關標頭檔都在該資料夾,若有其他要同步的函式庫也一並同步。千萬不要同步 /etc
資料夾,不然 /etc/ld.so.conf
的版本會被 RPi 取代,其中 RPi版本的檔案有 Windows 編譯器不支援的 include
語法,如果不小心被覆蓋掉的話可以嘗試修該語法或是還原成原來的檔案。
建置 Qt 5
- 開啟位於 MinGW32 toolchain 的跟目錄底下
msys\1.0\msys.bat
的 msys shell。 - 到剛剛下載 Qt 的儲存目錄中將 Qt 解壓縮 (也可以用 7z 解壓縮)。
- 在開始編譯以前先確認 MinGW gcc 以及 RPi 的編譯器有沒有被加到 Windows 環境變數的 PATH 中。
- 打開
qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\linux-arm-gnueabi-g++\qmake.conf
並將所有arm-linux-gnueabi-
以arm-linux-gnueabihf-
代替。 - 現在要準備開始建置 Qt,因為 Qt 的 QMake 建置腳本有 bug,所以我們必須分兩個步驟進行,我們先建置一個 QMake for Windows 後再建置 Qt 的 binaries。首先為了防止 MinGW 將某些 Qt 需要的功能去除在外,我們要修改 win32-g++ 平台的定義,檔案位置位於
qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\win32-g++\qmake.conf
,在 QMAKECXXFLAGS 該行最後面加上 ``-U_STRICT_ANSI``。 - 現在我們可以建置 Windows 工具了,建立一個資料夾 (例如: qt-build) 然後跑設定腳本,指令如下:
Note: 設定 Qt 的mkdir qt-build cd qt-build ../qt-everywhere-opensource-src-5.5.0/configure -platform win32-g++ -xplatform linux-arm-gnueabi-g++ -release -opengl es2 -device linux-rasp-pi2-g++ -sysroot C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot -prefix /usr/local/qt5
-opengl es2
選項是直接使用 RPi 的 framebuffer而非 X11。 Note2: 在上述指令中有出現絕對路徑的部分,若路徑有更改請再輸入指令時一並更改。 - 正常情況下 RPi 的 makespec 建置會失敗
- 在 qmake.exe 被建置的過程中為正常現象,可以使用
qtbase/bin/qmake -v
來檢查是否有建置成功。 - 現在我們就能編譯剩下的 Qt framework,首先我們需要修改
qtbase\configure
檔案,然後將在 ""Creating qmake line"" 之前的條件替換成以下程式片段 (大約在 3900 行的位置):if [ '!' -f "$outpath/bin/qmake.exe" ]; then
再打開設定腳本,這次在上一段程式碼後面增加以下片段
-device-option CROSS_COMPILE=C:/SysGCC/Raspberry/bin/arm-linux-gnueabihf- -qt-xcb
-device-option
是用來指定編譯目標設備的相關資訊,但是如果在Qmake的時候 (步驟5) 就先加上這一行,Qt 會以為你要 build Windows 版本的 Qmake。如果你在設定 Qt 建置腳本時候發生錯誤,請檢察:
- 你的
<toolchain安裝位置>\sysroot\etc\ld.so.conf
檔案中有以下內容:/opt/vc/lib /lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabihf/libfakeroot /usr/local/lib
- 你的 toolchain sysroot 資料夾有無
/opt/vc
這個資料夾。
如果都沒有幫助的話,重跑一次 Qt 建置腳本並在指令後面加上
-verbose
的變數,然後在後面加上">log.txt 2>&1"
,這樣系統在設定時就會將錯誤訊息寫至 log.txt 中。- 你的
等到系統回報說設置完成,執行
make&&make install
的指令就會開始建置 Qt,Qt 本身內容非常多,需要數個小時完成。 Warning: 千萬不要在make
之前就跑make install
會導致系統以為部分編譯失敗直到底將整個資料夾刪除或重建。
傳送檔案到 Raspberry Pi
打開 SmarTTY (在 ``
\Raspberry\TOOLS\PortableSmartty)然後連接到你的 RPi 上,輸入以下指令準備把編譯好的 Qt 傳進去: cd /usr/local sudo mkdir qt5 sudo chown pi qt5
Note: 如果使用 SmarTTY 遇到一職斷線的狀況,也可以使用 WinSCP 來傳送檔案。 Note: 第三行
chown
是用來改資料夾的權限,如果這行沒有被執行,到時候傳 qt5 資料夾中的東西進去時會接到權限不足的訊息。將 qt5 傳送到 RPi 中,在這個範例中,起始路徑與目標路徑如下:
C:\SysGCC\Raspberry\arm-linux\gnueabihf\sysroot\usr\local\qt5 /usr/local/qt5
傳輸完成後可以直接到 RPi 的
/usr/local/qt5/examples/opengl/qopenglwidget
資料夾中並執行./qopenglwidget
,如果從 HDMI 連接的螢幕有程式正常執行就成功了Note: 大部分的遠端桌面都沒辦法使用 OpenGL 造成 Qt 程式無法正常執行,除非確定你的遠端桌面有啟用 OpenGL 否則建議以 HDMI 觀看結果。