利用Windows Qt 撰寫 Raspberry Pi 的程式 (toolchain)

此教程為 Sysprogs 網站之教程翻譯版本,僅後半段設定 QtCreator 部分有所不同,原文網址在此,因為 Raspberry Pi 名稱很長,故文章中一律以 RPi 簡稱之。

安裝 Raspberry Pi Toolchain 以及 MinGW32 Toolchain

  1. 下載 Windows toolchain for Raspberry/PI 並安裝,安裝設定記得勾選 ALL users,此範例安裝版本為 GCC 4.9.2 2015-11-21-raspbian-jessie。
  2. 下載 Prebuilt GNU toolchain for mingw32 並安裝,安裝設定記得勾選 ALL users,此範例安裝版本為 Binutils 2.24 GCC 4.8.1 GDB 7.6.1。
  3. 下載並安裝 Python 2.7 for Windows 並確認檔案有被家道系統變數 PATH 中。
  4. 下載 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

  1. 開啟位於 MinGW32 toolchain 的跟目錄底下 msys\1.0\msys.bat 的 msys shell。
  2. 到剛剛下載 Qt 的儲存目錄中將 Qt 解壓縮 (也可以用 7z 解壓縮)。
  3. 在開始編譯以前先確認 MinGW gcc 以及 RPi 的編譯器有沒有被加到 Windows 環境變數的 PATH 中。
  4. 打開 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\linux-arm-gnueabi-g++\qmake.conf 並將所有 arm-linux-gnueabi-arm-linux-gnueabihf- 代替。
  5. 現在要準備開始建置 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``。
  6. 現在我們可以建置 Windows 工具了,建立一個資料夾 (例如: qt-build) 然後跑設定腳本,指令如下:
    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
    
    Note: 設定 Qt 的 -opengl es2 選項是直接使用 RPi 的 framebuffer而非 X11。 Note2: 在上述指令中有出現絕對路徑的部分,若路徑有更改請再輸入指令時一並更改。
  7. 正常情況下 RPi 的 makespec 建置會失敗
  8. 在 qmake.exe 被建置的過程中為正常現象,可以使用 qtbase/bin/qmake -v 來檢查是否有建置成功。
  9. 現在我們就能編譯剩下的 Qt framework,首先我們需要修改 qtbase\configure 檔案,然後將在 ""Creating qmake line"" 之前的條件替換成以下程式片段 (大約在 3900 行的位置):
    if [ '!' -f "$outpath/bin/qmake.exe" ]; then
    
  10. 再打開設定腳本,這次在上一段程式碼後面增加以下片段

    -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 中。

  11. 等到系統回報說設置完成,執行 make&&make install 的指令就會開始建置 Qt,Qt 本身內容非常多,需要數個小時完成。 Warning: 千萬不要在 make 之前就跑 make install 會導致系統以為部分編譯失敗直到底將整個資料夾刪除或重建。

傳送檔案到 Raspberry Pi

  1. 打開 SmarTTY (在 ``\Raspberry\TOOLS\PortableSmartty)然後連接到你的 RPi 上,輸入以下指令準備把編譯好的 Qt 傳進去:

       cd /usr/local
       sudo mkdir qt5
       sudo chown pi qt5
    

    Note: 如果使用 SmarTTY 遇到一職斷線的狀況,也可以使用 WinSCP 來傳送檔案。 Note: 第三行 chown 是用來改資料夾的權限,如果這行沒有被執行,到時候傳 qt5 資料夾中的東西進去時會接到權限不足的訊息。

  2. 將 qt5 傳送到 RPi 中,在這個範例中,起始路徑與目標路徑如下:

      C:\SysGCC\Raspberry\arm-linux\gnueabihf\sysroot\usr\local\qt5
    
      /usr/local/qt5
    
  3. 傳輸完成後可以直接到 RPi 的 /usr/local/qt5/examples/opengl/qopenglwidget 資料夾中並執行 ./qopenglwidget,如果從 HDMI 連接的螢幕有程式正常執行就成功了

    Note: 大部分的遠端桌面都沒辦法使用 OpenGL 造成 Qt 程式無法正常執行,除非確定你的遠端桌面有啟用 OpenGL 否則建議以 HDMI 觀看結果。

results matching ""

    No results matching ""