嵌入式界面開發—qt源碼庫在樹莓派中的部署

想要在嵌入式設備中運行qt程序(其他的程序一樣),要在嵌入式設備中將程序運行所依賴的庫部署。網上部署方式千萬種,例如直接將庫編譯之後寫入鏡像,然後用這個鏡像來安裝樹莓派的系統;也有在嵌入式設備中直接安裝qt。本文介紹最普遍的部署方式,就是在pc端的ubuntu中交叉編譯庫源碼,然後上傳編譯好的庫到樹莓派,最後配置qt creator交叉編譯的kit來實現在pc端編譯自碼程序,上傳到樹莓派運行

 

一、開發環境

樹莓派版本:Raspberry Pi 3 Model B

樹莓派系統:Raspbian(stretch)

PC端系統:ubuntu 18.04

Qt庫版本:5.12.5

關於你的系統是stretch還是buster,可以查看系統鏡像源的方式來確定

cat /etc/apt/sources.list

 

二、資源下載

Qt源代碼下載(5.12.5):

http://download.qt.io/archive/qt/5.12/5.12.5/single/

ubuntu下Qt安裝包(.run、5.12.5):

http://download.qt.io/archive/qt/5.12/5.12.5/

下載交叉編譯連

(gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf):

https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/

下載cross-compile-tools:

git clone https://github.com/darius-kim/cross-compile-tools.git

使用迅雷下載可破下載速度慢的問題

 

三、配置交叉編譯環境並編譯

下文中將分別在樹莓派端和電腦端進行配置

[PI]代表樹莓派端

[PC]代表電腦端

我建議是創建一個文件夾,專門放置這些交叉編譯文件以及一切跟qt交叉編譯環境以及編譯好的庫文件和文件夾。我是創建了一個名爲raspi文件夾

 

[PI]更新軟件源並下載必要軟件

更新固件並重啓

sudo rpi-update
reboot

先把系統默認的源進行備份

sudo cp /etc/apt/sources.list /etc/apt/sources.list.pre
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.pre

我們的系統是stretch版本,這一點要注意。接下來把鏡像源設置成國內的,這樣下載速度快一些。

編輯/etc/apt/sources.list刪除原有內容,並添加以下內容

​​​​

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
#deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

編輯/etc/apt/sources.list.d/raspi.list刪除原有內容,並添加以下內容​​​​​​​

deb http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
#deb-src http://mirror.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui

更新​​​​​​​

sudo apt update
sudo apt-get upgrade

有教程說需要安裝以下兩個包,但是我沒有成功安裝但是最後也可以使用。我列出來有需要的人可以試一試​​​​​​​

sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5

以下軟件要成功安裝​​​​​​​

sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
sudo apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev libraspberrypi-dev libpq-dev libmariadbclient-dev bluez libbluetooth-dev build-essential

 

[PI]準備目標文件夾

在樹莓派的/usr/local下創建qt5pi文件夾,之後的的庫文件會放在這個文件夾之下​​​​​​​

sudo mkdir /usr/local/qt5pi
sudo chown pi:pi /usr/local/qt5pi

 

[PI]配置調試運行環境

首先需要給/opt文件夾權限,因爲如果是要配置遠程調試的話,編譯好的可執行文件會放在這個文件夾下

sudo chmod -R 777 /opt

遠程調試需要安裝其他軟件

sudo apt-get install gdbserver

 

[PC]配置交叉編譯環境

解壓交叉編譯工具到raspi/cross-compile-tools​​​​​​​

cd ~/raspi/cross-compile-tools
tar xvJf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

配置交叉編譯鏈的環境變量​​​​​​​

cd ~
gedit .bashrc
PATH=$PATH:~/raspi/cross-compile-tools/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin

保存退出後,刷新變量文件

source .bashrc

檢查交叉編譯環境安裝是否正確

arm-linux-gnueabihf-g++ -v

輸出以下內容則配置正確

 

[PC]創建sysroot

sysroot是樹莓派上的文件在PC上的拷貝,編譯過程中需要的頭文件、庫等會在這裏查找,sysroot文件夾創建在raspi文件夾下,並在sysroot下創建usr和opt文件夾​​​​​​​

cd ~/raspi
mkdir sysroot
mkdir sysroot/usr
mkdir sysroot/opt

使用rsync同步樹莓派文件夾到pc端,raspberrypi_ip代表樹莓派的IP地址​​​​​​​

rsync -avz pi@raspberrypi_ip:/lib sysroot
rsync -avz pi@raspberrypi_ip:/usr/include sysroot/usr
rsync -avz pi@raspberrypi_ip:/usr/lib sysroot/usr
rsync -avz pi@raspberrypi_ip:/opt/vc sysroot/opt

下一步將sysroot的符號調整爲相對的

cd ~/raspi
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

 

[PC]配置Qt

將之前下載好的Qt源碼解壓到raspi​​​​​​​

cd ~/raspi
tar xvf qt-everywhere-src-5.12.5.tar

可以給源碼文件夾換成一個自己喜歡的名字,我把文件夾命名爲raspi-qt-5125

mv qt-everywhere-src-5.12.5 raspi-qt-5125

然後我們使用configure來配置編譯Qt所需要的一些模塊,configure可選擇的參數很多,大家可以參考下面這個文章寫的不錯:https://blog.csdn.net/xi_gua_gua/article/details/53413930

我們列舉出一些參數來配置,首先來編譯qtbase​​​​​​​

cd ~/raspi/raspi-qt-5125/qtbase
./configure -release -no-opengl -device linux-rasp-pi3-vc4-g++ -device-option CROSS_COMPILE=/home/lmhubuntu/raspi/cross-compile-tools/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5pi-host -v

接下來對裏面的參數做一些解釋

-release 
加上此選項編譯程序Qt不會做出優化,往往在開發過程使用此選項,是默認選項
-opengl es2 
表示編譯帶opengl es2的Qt,如果編譯出錯執行,則執行sudo apt-get install libgles2-mesa-dev
-device linux-rasp-pi3-vc4-g++
選擇的目標設備,目標設備的配置文件可在/qtbase/mkspec/device找到
-device-option CROSS_COMPILE=
~/raspi/cross-compile-tool/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- 
交叉編譯器的路徑
-sysroot ~/raspi/sysroot 
剛剛構建的樹莓派文件系統的路徑
-opensource 
以開源版本發佈程序
-confirm-license 
自動確認許可證(使用開源或是商業)
-make libs 
在make時添加要構建的組件. (默認爲:libs tools examples)
-prefix /usr/local/qt5pi
目標板的Qt程序安裝目錄,默認路徑是/usr/local/Qt-版本號 (make完成後看看PC端對應目錄下是否有qt5pi目錄)
-extprefix ~/raspi/qt5pi 
指定Qt 交叉編譯庫存放位置。默認路徑是SYSROOT/PREFIX。此目錄最後需要同步rsysc到目標板的/usr/local/目錄下。
-hostprefix ~/raspi/qt5-host
指定Qt 編譯的可執行工具存放的位置,比如qmake,默認路徑與-extprefix參數一致。
-no-use-gold-linker 
不要使用GNU gold linker進行鏈接。對於 5.9.1 或更高版本的 Qt必須添加此選項,不然編譯會報錯
-v 
顯示每個步驟的詳細信息
-no-gbm
不要編譯 GBM 的後端

 

[PC]編譯並安裝Qt庫

接下來對Qt庫進行編譯並安裝,這個過程應該是幾十分鐘,具體取決於電腦的速度。這個安裝是安裝在~/raspi/qt5pi下​​​​​​​

cd ~/raspi/raspi-qt-5125/qtbase
make -j4
make install

編譯完成之後,同步到樹莓派下的/usr/local/qt5pi下​​​​​​​

cd ~/raspi
rsync -avz qt5pi pi@raspberrypi_ip:/usr/local

 

[PC]編譯其他模塊

我們之前之所沒有一次性全部編譯所有模塊,首先是因爲不是所有模塊我們都用得到,其次是因爲其中會出很多錯,所以就每個模塊單獨編譯。

之前已經創建出qmake,所以直接使用就好。

定位到想要編譯的模塊的文件夾下,比如我們編譯qtdeclarative,這其中包含qml模塊​​​​​​​

cd ~/raspi/raspi-qt-5125/qtdeclarative
~/raspi/qt5pi-host/bin/qmake
//或者
sudo ~/raspi/qt5pi-host/bin/qmake
make -j4
make install

最後同步到樹莓派​​​​​​​

cd ~/raspi
rsync -avz qt5pi pi@raspberrypi_ip:/usr/local

 

[PC]配置qt creator的交叉編譯環境

首先要安裝qt creator,執行之前下載的.run文件

./qt-opensource-linux-x64-5.12.5.run

安裝完成之後,對以下幾個選項進行配置(Tools->Options->Kits)

Qt Version使用~/raspi/qt5pi-host/bin下的qmake

Compilers使用我們之前的交叉編譯鏈下的g++和gcc

Debuggers(GDB)使用交叉編譯鏈下的gdb

然後保存kit

 

四、測試

我們將編譯好的代碼傳到樹莓派端,使用sftp​​​​​​​

sftp pi@raspberrypi_ip
put xxxx

在樹莓派端執行./xxxx -platform linuxfb,其中-platform linuxfb是指定平臺

純widget界面

 

純qml界面

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章