这个教程将指导你如何在电脑上交叉编译Qt 5.12.4并安装到树莓派。这样你就可以在电脑上用Qt Creator设计和编译树莓派的应用,然后直接在树莓派上运行和调试。
这篇教程使用树莓派3B+和Qt 5.12.4。电脑的操作系统是Linux(ubuntu 64位),树莓派的操作系统是Raspbian Stretch with desktop。
在命令行界面使用以下命令更新固件,更新完成后重启系统。
sudo rpi-update
reboot
确保树莓派上的SSH协议已经打开。后续Qt Creator需要通过SSH和树莓派通信。可以执行以下命令打开设置界面,选择Interfacing Options,选择ssh,选择yes然后finish。
sudo raspi-config
以下清单总结了交叉编译Qt 5.12.3的主要步骤,我们将在这篇文章中逐一介绍。[PI]表示在树莓派上操作,[PC]表示在电脑上操作。
1. [PI] 安装开发包
2. [PI] 准备目标文件夹
3. [PI] 配置调试及运行环境
4. [PC] 创建工作文件夹并设置工具链
5. [PC] 创建和配置sysroot
6. [PC] 下载Qt
7. [PC] 配置Qt
8. [PC] 编译、安装和部署Qt
9. [PC] 配置Qt Creator实现交叉编译树莓派的应用
10. [PI] 复制字体
首先在/etc/apt/sources.list文件中取消注释deb-src这行。
sudo leafpad /etc/apt/sources.list
下一步是更新,然后下载需要的开发包。
sudo apt-get update
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 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/Qt5.12.4文件夹,后面编译好的Qt库会从电脑部署到这个文件夹。
sudo mkdir /usr/local/Qt5.12.4
sudo chown pi:pi /usr/local/Qt5.12.4
编译好的可执行文件会放在树莓派的/opt目录下,但默认的pi用户没有创建文件夹或文件的权限,需要在根目录执行:
sudo chmod -R 777 /opt
远程调试时需要安装gdbserver:
sudo apt-get install gdbserver
增加分辨率设置:
sudo leafpad ~/.profile
在其中增加:
# physical display properties
export QT_QPA_EGLFS_PHYSICAL_WIDTH=1920
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=1080
然后执行:
source .profile
在电脑上创建工作文件夹。
mkdir ~/raspi
cd ~/raspi
在linaro上下载交叉编译工具链,包括gcc、runtime、sysroot三项:
下载后解压并合并,放在~/raspi/cross-compile-tool/目录下
如果电脑上没有C/C++编译环境,执行:
sudo apt-get install build-essential
如果是openSUSE,执行:
sudo zypper install -t pattern devel_basis
使64位系统兼容32位的库:
sudo apt install lib32ncurses5 lib32z1
sysroot是树莓派上的文件在PC上的拷贝,编译过程中需要的头文件、库等会在这里查找。
mkdir sysroot sysroot/usr sysroot/opt
我们可以使用rsync进行树莓派和sysroot之间的同步。如果电脑上的sysroot文件夹发生任何变化,都会被自动同步到树莓派上。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中的符号链接调整为相对的,因为这个文件夹在电脑和树莓派上都会有。
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot
下载并解压Qt 5.12.4,当然其他版本也可以。
wget http://download.qt.io/official_releases/qt/5.12/5.12.4/single/qt-everywhere-src-5.12.4.tar.xz
tar xvf qt-everywhere-src-5.12.4.tar.xz
cd qt-everywhere-src-5.12.4
编辑./qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf文件:
① 分别将所有的-lEGL替换成-lbrcmEGL,-LGLESv2替换成-lbrcmGLESv2。
② 修正文件中的4处错误,修正后如下:
VC_LIBRARY_PATH = $$[QT_SYSROOT]/opt/vc/lib
VC_INCLUDE_PATH = $$[QT_SYSROOT]/opt/vc/include
VC_LINK_LINE = -L$${VC_LIBRARY_PATH}
QMAKE_LIBDIR_OPENGL_ES2 = $${VC_LIBRARY_PATH}
配置Qt库:
./configure -release -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -skip qtwayland -skip qtlocation -skip qtscript -make libs -prefix /usr/local/Qt5.12.4 -extprefix ~/raspi/Qt5.12.4 -hostprefix ~/raspi/Qt5.12.4-host -no-use-gold-linker -v -no-gbm
这一步大概需要2~3小时。
make
make install
编译完成后使用rsync命令将编译好的Qt库同步到树莓派。
rsync -avz Qt5.12.4 pi@raspberrypi_ip:/usr/local
如果电脑上还没有Qt Creator,需要首先下载并安装。然后根据以下步骤配置交叉编译。
首先,打开Qt Creator,进入工具 -> 选项菜单,选择设备->设备,点击添加,选择通用Linux设备。
给这个配置起个名字(Raspberry Pi),填好网络名或IP、用户名(pi)、密码(默认是raspberry)。
向导完成前会验证到树莓派的连接,之后在Qt Creator中会多出一个新的设备。
下一步,在Kits的编译器页中,添加针对树莓派的GCC C 和 C++ 交叉编译器。
GCC的C编译器在~/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-gcc。C++的编译器以及调试器也在同一路径下。
在Kits -> Qt Version中添加一个Qt版本,在~/raspi/Qt5.12.4-host/bin/qmake。
最后,在Kit中添加一个新的kit,设置名称以及图标,以及其他设置如下:
Device type: Generic Linux Device
Device: Raspberry Pi (defaut for Generic Linux)
Sysroot: ~/raspi/sysroot
Compiler C: GCC (Raspberry Pi)
Compiler C++: GCC (Raspberry Pi)
Debugger: GDB (Raspberry Pi)
Qt version: Qt 5.12.4 (Raspberry Pi)
到底为止所有的配置已经完成,你可以创建一个新工程并选择刚才创建的kit:Raspberry Pi。
现在可以在电脑上设计、编译、部署,在树莓派上运行和调试了。
注意:目前没找到远程调试时比较好的可以显示窗口的办法。可以在PC上安装VNC Viewer(https://www.realvnc.com/en/connect/download/viewer/linux/),在Qt Creator的Project - Run - Run - Command line argumens中增加-platform vnc,然后用VNC Viewer连接即可。注意要先在Qt Creator中启动调试,再用VNC Viewer连接。
安装中文字体库:
sudo apt-get install ttf-wqy-zenhei
复制中文字体库:将/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc 复制到 /usr/local/qt5pi/lib/fonts。
复制英文字体库:将/usr/share/fonts/truetype/dejavu 中的文件复制到 /usr/local/qt5pi/lib/fonts。