1. 程式人生 > >樹莓派Raspberry Pi的嵌入式QT平臺

樹莓派Raspberry Pi的嵌入式QT平臺

在樹莓派上設計桌面應用一般情況會依賴於X11環境,如果是Windows平臺,就目前而言,我們也可以選擇Windows 10 IoT環境進行開發。UWP目前也支援在樹莓派2上進行部署。至於常見的Linux X11或者Wayland環境,相比之下比較冗餘,但是QT Emebedded直接利用Framebuffer,顯示GUI,會更加輕便。利用樹莓派 Open GL支援,更可以開發出3D效果,是工業領域開發設計視覺化裝置的不錯選擇,更是物聯網裝置一個比較好的互動方案。

1. 準備工具

我們要在Windows上對QT 5.5進行交叉編譯,所以我們需要準備以下工具:

2. 安裝Rasbian

將SD插入樹莓派,接上電源和HDMI,啟動系統,預設使用者pi,密碼raspberry登入系統 (建議開啟Raspi-config配置系統預設進入CLI,修改管理員密碼,配置GPU記憶體128MB,然後重啟)。

執行命令進行系統更新。

sudo apt-get update

sudo apt-get upgrade

建議:先預先安裝下面庫,交叉編譯Qt,xcb依賴這些庫,預設Raspbian中可能不帶

sudo apt-get install libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-glx0-dev

你可能會碰到某些庫無法下載,你可以手動下載然後通過 dpkg -i 來安裝。

3. 同步Linux環境

在Windows中交叉編譯Qt,需要先同步樹莓派Linux 庫、標頭檔案到sysroot下。在<sysgcc>\Raspberry\TOOLS中開啟 UpdateSysroot.bat  (<sysgcc>為toochain的安裝目錄,例如C:\SysGCC)

在Targeted Linux machine輸入選擇你的樹莓派,如上圖輸入你需要同步的目錄,建議同步/opt目錄 (在輸入框裡按 Ctl+Enter換行,直接按Enter預設為開始同步,請注意)

,裡面包含了OpenGL的標頭檔案,我們在編譯Qt需要引用。 注意,千萬不要同步/etc目錄,因為他會複寫本地的/etc/ld.so.conf檔案,會破化Windows下編譯時的標頭檔案引用。如果不小心同步了,我們需要重新安裝  aspberry-gcc4.6.3.exe 來提取恢復此檔案。

4. 配置編譯qmake

我們需要先解壓縮下載下來的qt原始碼包,比如解壓縮在C:\qt-everywhere-opensource-src-5.5.0 (可以用7-zip來解壓縮)。或者開啟MinGW32下的msys (<sysgcc>\MinGW32\msys\1.0\msys.bat) 進入你的qt程式碼下載目錄(例如 C:\download)

然後確認程式碼全部解壓縮到當前目錄下,確認gccarm-linux-gnueabihf-gcc工具的路徑

如果沒有找到gcc和arm-linux-gnueabihf-gcc,你可以設定你的Windows系統PATH環境變數,加入 c:\SysGCC\Raspberry\bin和c:\SysGCC\MinGW32\bin

開啟 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\linux-arm-gnueabi-g++下的qmake.conf檔案,將所有的arm-linux-gnueabi-替換成arm-linux-gnueabihf-,如下圖:

好了,現在我們可以開始編譯Qt。由於Qmake編譯指令碼的一個bug,我們無法直接交叉編譯Raspberry版本,需要分為兩步,先編譯Windows Qmake然後再交叉編譯Raspberry Qt。

開啟 qt-everywhere-opensource-src-5.5.0\qtbase\mkspecs\win32-g++ 下的qmake.conf檔案,在 CXXFLAGS 後面新增 -U__STRICT_ANSI__ 標記

輸入下面的命令開始編譯Qmake for Windows

cd /c/download

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

選擇 'o' Open Source和yes同意GPLV2&3許可證

-opengl es2引數:配置Qt直接使用Raspberry framebuffer 而不是X11

全部配置完成後,你可以用命令 qtbase/bin/qmake -v 檢查下qmake是否配置成功

5. 交叉編譯Qt for Raspberry

現在我們開啟 C:\download\qt-everywhere-opensource-src-5.5.0\qtbase\configure 檔案,找到3900行左右 "Creating qmake...",修改為:

if [ '!' -f "$outpath/bin/qmake.exe" ]; then

注意qmake.exe後面的.exe副檔名和最後的then。使用已經編譯好的Windows qmake而不用再去生成qmake

好了,到此我們做好了所有的準備工作,就要開始編譯Qt for Raspberry Pi了。在這之前,建議大家再次確認下是否有遺漏或者錯誤,不然一次編譯就需要十幾個小時,中斷後再來很費時間。

回到msys視窗,進入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 -device-option CROSS_COMPILE=C:/SysGCC/Raspberry/bin/arm-linux-gnueabihf- -qt-xcb

同樣輸入 "o" 和 "yes" 使用開源版本和同意許可證內容。

可以忽略出現的警告。但如果出現缺少庫依賴的錯誤,請回到第3步,同步Linux環境,檢查是否已經同步了必要的目錄。檢查是否在Raspbian中遺漏了必須的庫。可以按照輸出提示,去檢查Qt環境的依賴庫,並且在Raspbian中手動安裝,然後再進行一次同步。

你也可以檢查 <sysgcc>\Raspberry\arm-linux-gnueabihf\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

如果你看到了下面的內容,那麼你就可以輸入 make && make install 開始編譯安裝。不出意外,整個過程開啟需要15小時左右,具體視機器效能,反正我花了20小時完成所有編譯安裝。預設會安裝到 <sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5 目錄。

6. 同步Qt到Raspbian並測試

等待一天後,編譯安裝完成,我們就可以將安裝在本地PC上的Qt複製到Raspberry中。不建議使用SFTP工具進行上傳,因為SFTP上傳無法將檔案屬性複製過去。這裡建議使用 toolchain 中自帶的SmarTYY來完成上傳。開啟 <sysgcc>\Raspberry\TOOLS\PortableSmartty下的 SmarTTY.exe 工具,配置連線到你的樹莓派。

cd/usr/local

sudomkdirqt5 sudo chown pi qt5

建立Qt 5的安裝目錄,然後開啟SmarTYY選單,選擇上傳目錄。

配置本地目錄為 <sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5, 遠端目錄為 /usr/local/qt5,開始上傳

完成後,我們就可以在SSH中進行測試,進入 /usr/local/qt5/examples/widgets/richtext/textedit 執行例子 ./textedit。這時如果你的樹莓派連線著顯示器,你就會看到一個文字編輯器顯示出來,接上滑鼠鍵盤,你就可以進行圖形化介面操作了。

SSH端:

樹莓派連線的顯示器:



接著上篇 "",我們已經成功在Windows上交叉編譯了Raspberry Pi的嵌入式Qt 5.5。那麼我們就可以開始開發基於Qt 5的應用程式。接下來,我們需要在Windows上搭建必要的Qt開發工具,首當其衝就是官方的Qt Creator,不僅提供了原生的C++編輯器,Qt介面設計器,而且還可以整合現有的 Qmake, gcc 甚至於Visual Studio C++編譯器來配置編譯Qt專案,自帶的QML直譯器可以快速的將QML內容翻譯成程式碼並整合子啊專案中;而且利用自帶的GDB可以進行程式碼執行時除錯。

下面,我們就利用Windows平臺上的Qt Creator與我們已經準備好的樹莓派中的 Qt 5.5 來整合開發基於Raspberry Pi的Qt Embedded應用程式。過程中,我們需要交叉編譯Raspberry Pi版的GDB用於遠端除錯。

1. 準備工作

安裝Qt for Windows,我們可以註冊一個Qt賬號,然後選擇安裝目錄並繼續。

2. 配置編譯環境

安裝完成後,開啟Qt Creator。在Creator中的專案,類似於 Xcode,我們需要配置好多種目標環境,不同的專案需要配置指定目標環境,就可以針對目標編譯生成。

開啟Tools -> Options...

選擇Devices,點選Add..增加一個Generic Linux Device,然後Start Wizard,填入裝置名字,網路地址以及使用者名稱密碼等。

完成後,會自動開始測試裝置連線。

然後我們可以開始配置Build & Run,選擇Qt Versions,新增一個Qt Version,選擇我們之前編譯好的Windows下的qmake:

然後新增一個Compiler,選擇Compilers選項卡,Add.. 一個MinGW型別的編譯器,選擇<sysgcc>\Raspberry\bin\arm-linux-gnueabihf-g++.exe

新增一個CMake,<sysgcc>\Raspberry\bin\make.exe

好了,最後我們就需要配置出一個Kit,包含一個目標環境所需要的qmake,裝置,CMake,以及配置檔案。點選Kits選項卡:

  • Device type:Generic Linux Device
  • Device:選擇你剛才新建的裝置
  • Sysroot:<sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot
  • Compiler:選擇新建的編譯器
  • Qt version:選擇Raspberry Pi的Qt
  • Qt mkspec:<sysgcc>\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\qt5\mkspecs\devices\linux-rasp-pi2-g++
  • CMake Tool:選擇新建的CMake

儲存新的Kit配置。

因為Qt Creator的Debugger GDB需要有Python支援,但是MinGW中提供的GDB均沒有支援Python,所以我們目前無法指定Debugger,需要之後交叉編譯一個Raspebrry Pi支援的GDB with Python才可以作為Debugger來除錯。

3. 新建Qt for Raspberry Pi專案並編譯測試

點選 File -> New File or Project,開啟新建專案嚮導,選擇Qt Widgets專案模板,填入專案名稱,務必在Kit Selection中選擇才新建的Kit環境。

完成程式碼後,我們可以通過左下側的編譯執行按鈕直接編譯輸出到Raspberry Pi

目前我們只能使用Run,還無法使用偵錯程式。我們可以開啟Qt Examples中的專案來進行測試。

上篇講到“在Windows下用Qt Creator開發編譯Raspberry Qt 5應用程式”,由於目前Qt Creator所支援的GDB需要有Python支援,但是目前MinGW中的GDB都是無Python支援的,所以我們需要自己下載GDB程式碼並且編譯成針對Raspberry Pi支援Python的版本。

1. 準備工作

解壓縮Qt Creator原始碼,放入C:\Download目錄,並且將其他下載的庫及程式碼放入 C:\Download\qt-creator-opensource-src-3.6.0-rc1\dist\gdb\source (在gdb目錄下新建一個source目錄)

2. 配置編譯環境

有人要說,為什麼不用之前toolchain for Windows的MinGW32來編譯,因為經過本人多次嘗試,發現toolchain中的MinGW版本過低,有一個time.h的結構體宣告bug導致我們GDB編譯無法進行。所以我們需要更新到最新的MinGW版本來編譯GDB

安裝MinGW-get到C:\MinGW

完成後開啟 C:\MinGW\bin\mingw-get.exe,選擇 Basic Setup->勾選右側列表中 mingw-developer-toolkit, mingw32-base,mingw32-gcc-g++以及msys-base軟體包,點選選單Installation->Apply Changes 完成軟體包的安裝。

安裝軟體完成後,開啟 C:\MinGW\msys\1.0\msys.bat 進入MinGW shell環境。

3. 配置編譯GDB with Python for Win/Linux/ARM

開啟 C:\Download\qt-creator-opensource-src-3.6.0-rc1\dist\gdb\Makefile.mingw 檔案

在targets那一行新增Raspberry Pi的ABI:arm-linux-gnueabihf,然後儲存檔案。開啟msys shell,進入目錄 C:\Download\qt-creator-opensource-src-3.6.0-rc1\dist\gdb,make這個Makefile.mingw開始編譯:

注意:過程中可能會下載一些軟體包,確保你的網路連線的穩定,有條件的可以FQ連上VPN。如果下載一直出現問題,則可以選擇手動下載那些軟體包放入source目錄中。

當編譯打包全部完成後(大概會花一個小時編譯),你可以在 C:\Download\qt-creator-opensource-src-3.6.0-rc1\dist\gdb\qtcreator-gdb-7.10 找到編譯好的GDB,並且也有一個打包好的 qtcreator-gdb-7.10-mingw32_nt-6.2-i686.tar.gz 在\dist\gdb目錄下。

4. 在Qt Creator中配置並聯機除錯Qt for Raspberry Pi應用

開啟Qt Creator,進入Tools->Options...->Build & Run->Debugger,新增一個Debugger,選擇剛才編譯出來的gdb.exe,如下圖,儲存後。

開啟Kits,選擇之前配置好的Rasspberry Pi的開發Kit,在Debugger下選擇配置好的Debugger,點選OK儲存關閉。

好了,至此,Qt Creator就可以使用按鈕進行聯機除錯,可以設定斷點,檢視執行時記憶體,執行緒狀態。GDB會向Raspberry Pi推送一個gdbserver,並且聯合本地的GDB進行除錯。下面面是我除錯一個Qt for Raspberry Pi應用時的截圖: