想要在嵌入式設備中運行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是指定平臺