一、在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)

在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)

本系列导航

1. 对交叉编译的基本理解
2. Qt的交叉编译(带EGLFS支持)

3. OpenCV的交叉编译(OpenCV4.5.0)

文章目录

  • 在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)
  • 目标
  • 一、环境介绍
  • 二、在树莓派上的前期准备
    • 1. 更新树莓派固件(本地更新)
    • 2. 在树莓派上安装依赖包
    • 3. 在树莓派上建立文件夹并修改权限
    • 4. 在树莓派上开启GL Driver,并以命令行模式启动
    • 5. 在树莓派上把用户pi添加到渲染组
  • 二、在PC上的前期准备
    • 1. 在PC上下载交叉编译器并配置环境变量
      • 配置环境变量
    • 2. 在PC上下载Qt Creator安装包和Qt源码
    • 3. 在PC上创建并配置sysroot
  • 三、交叉编译Qt
  • 四、配置Qt Creator
  • 五、例程测试
  • 总结


目标

  1. PC端(Ubuntu) 上编译的 Qt程序 能够在 树莓派 上执行
  2. 交叉编译的Qt要带EGLFS支持。

EGLFS是一个Qt5的平台插件,它的作用就是让QT应用直接运行在EGL和OpenGL ES 2.0上。说白了,就是能让你绕过图形桌面,直接从显卡输出Qt图像到屏幕。

一、环境介绍

  1. 硬件设备
    树莓派 Raspberry Pi 4B,镜像版本为2021-01-11-raspios-buster-armhf-full;
    PC端的Ubuntu18.04(在VMware 16.0 Pro虚拟机上运行)。
  2. 软件版本
    Qt 5.14.2

二、在树莓派上的前期准备

!!注意!!
这部分操作全部在树莓派上进行

1. 更新树莓派固件(本地更新)

如果直接执行

sudo rpi-update

大概率不会成功,因此直接提供本地更新的方法。
Click Me,链接至本地更新方法

2. 在树莓派上安装依赖包

这里有的没的建议都安装上,防止后面交叉编译缺少依赖。下面的包可能有重复的,为了保险可以都执行一遍,如果树莓派发现包已经安装过了,只是会提示,并不会造成隐患或不好的影响。

先更新。

sudo apt-get update
sudo apt-get upgrade

再安装。

sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev
sudo apt-get install libgles2-mesa-dev libgbm-dev
sudo apt-get install ttf-wqy-zenhei
sudo apt-get install gdbserver
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
sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev
sudo apt-get install dbus-*dev
sudo apt install libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxkbcommon-x11-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev
sudo apt install ninja-build libdrm-dev

3. 在树莓派上建立文件夹并修改权限

sudo mkdir /usr/local/qt5pi   # 用来安装qt运行库
sudo chown -R pi:pi /usr/local/qt5pi
mkdir /home/pi/qt5  # 用来存放以后自己写的qt程序可执行文件

4. 在树莓派上开启GL Driver,并以命令行模式启动

sudo raspi-config

选择 1 System Options
在这里插入图片描述
选择 S5 Boot / Auto Login
在这里插入图片描述

选择 B2 Console Autologin
在这里插入图片描述

注:如果之后还想开机进入桌面的话,同样在这里修改,选择 B4 Desktop Autologin 即可。

然后按照系统提示重启,重启后自动进入命令行。

5. 在树莓派上把用户pi添加到渲染组

sudo gpasswd -a pi render

二、在PC上的前期准备

1. 在PC上下载交叉编译器并配置环境变量

创建文件夹,我的目录是:

mkdir ~/Work/raspi
mkdir ~/Work/raspi/cross-compile-tool
cd ~/Work/raspi

在linaro网站下载交叉编译工具链合并放到~/Work/raspi/cross-compile-tool目录下,包括gcc、runtime、sysroot三项:
在这里插入图片描述
!!注意!!
合并指的是把三个压缩包的内容合并到一个文件夹下,所以cross-compile-tool文件夹看起来应该是这样的:
在这里插入图片描述

配置环境变量

打开profile文件

sudo nano /etc/profile

profile文件最后一行增加下面这行代码。

export PATH=$PATH:~/Work/raspi/cross-compile-tool/bin

ctrl+o保存文件,回车, ctrl+x 退出nano编辑器。

刷新环境变量。

source /etc/profile

测试变量是否写入成功(如果看到了刚刚设置的PATH就是成功了)。

echo $PATH

打开sudoers。

sudo nano /etc/sudoers

修改secure_path路径内容(把交叉编译工具链的路径放在secure_path的后面)。

secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/yjx/Work/raspi/cross-compile-tool/bin"

ctrl+o保存文件,回车, ctrl+x 退出nano编辑器。

检查配置是否完成(注意,两个都需要有正常的版本信息输出,这一步才算完成)。

arm-linux-gnueabihf-g++ -v
sudo arm-linux-gnueabihf-g++ -v

2. 在PC上下载Qt Creator安装包和Qt源码

在这里的子目录,Click Me下载:
① qt-opensource-linux-x64-5.14.2.run(安装包)
② qt-everywhere-src-5.14.2.tar.xz(源码)

安装包可直接运行。(不知道装啥组件的话就全装上)
在这里插入图片描述
源码解压,可解压到目录~/Work/raspi。
在这里插入图片描述

3. 在PC上创建并配置sysroot

这一步是要把树莓派上的库都传到PC上来,形成一个和树莓派一样的环境,方便交叉编译的时候链接到里面的库和头文件。

在PC上执行以下命令把树莓派的库和头文件拷贝到PC上(IP地址要改成自己的)。

cd ~/Work/raspi
rsync -avz pi@192.168.31.188:/lib sysroot
rsync -avz pi@192.168.31.188:/usr/include sysroot/usr
rsync -avz pi@192.168.31.188:/usr/lib sysroot/usr
rsync -avz pi@192.168.31.188:/opt/vc sysroot/opt

附一个问题的解决:
报错:rsync error: some files/attrs were not transferred (see previous errors) (code 23)
解决方法,Click Me。

利用网上现成的python脚本修改sysroot里面的软链接(把路径从树莓派的绝对路径改为PC上对应的路径)。

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

三、交叉编译Qt

配置编译参数(先编译qtbase)。

cd ~/Work/raspi/qt-everywhere-src-5.14.2/qtbase/./configure -release -opengl es2 -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/Work/raspi/cross-compile-tool/bin/arm-linux-gnueabihf- -sysroot ~/Work/raspi/sysroot -opensource -confirm-license -reduce-exports -make libs -prefix /usr/local/qt5pi -extprefix ~/Work/raspi/qt5pi -hostprefix ~/Work/raspi/qt5pi-host -v
参数说明
-opengl es2编译时带opengl
-device linux-rasp-pi4-v3d-g++选择目标设备为Raspberry Pi 4
-device-option CROSS_COMPILE=~/Work/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-交叉编译器路径
-sysroot ~/Work/raspi/sysrootsysroot的路径
-prefix /usr/local/qt5piQt在树莓派中的路径
-extprefix ~/Work/raspi/qt5piPC上的交叉编译后Qt的路径(这个目录下的内容最终会被放到树莓派上)
-hostprefix ~/Work/raspi/qt5pi-host在PC上交叉编译Qt工程的工具存放的位置(里面有qmake)

这里是我的build options,供参考(可在config.summary中查看)。

Build options:Mode ................................... releaseOptimize release build for size ........ noBuilding shared libraries .............. yesUsing C standard ....................... C11Using C++ standard ..................... C++17Using ccache ........................... noUsing new DTAGS ........................ yesRelocatable ............................ yesUsing precompiled headers .............. yesUsing LTCG ............................. noTarget compiler supports:NEON ................................. yesBuild parts ............................ libs
Qt modules and options:Qt Concurrent .......................... yesQt D-Bus ............................... yesQt D-Bus directly linked to libdbus .... yesQt Gui ................................. yesQt Network ............................. yesQt Sql ................................. yesQt Testlib ............................. yesQt Widgets ............................. yesQt Xml ................................. yes
Support enabled for:Using pkg-config ....................... yesudev ................................... yesUsing system zlib ...................... yesZstandard support ...................... no
Qt Core:DoubleConversion ....................... yesUsing system DoubleConversion ........ yesGLib ................................... yesiconv .................................. noICU .................................... yesBuilt-in copy of the MIME database ..... yesTracing backend ........................ Logging backends:journald ............................. nosyslog ............................... noslog2 ................................ noPCRE2 .................................. yesUsing system PCRE2 ................... yes
Qt Network:getifaddrs() ........................... yesIPv6 ifname ............................ yeslibproxy ............................... noLinux AF_NETLINK ....................... yesOpenSSL ................................ yesQt directly linked to OpenSSL ........ noOpenSSL 1.1 ............................ yesDTLS ................................... yesOCSP-stapling .......................... yesSCTP ................................... noUse system proxies ..................... yesGSSAPI ................................. no
Qt Gui:Accessibility .......................... yesFreeType ............................... yesUsing system FreeType ................ yesHarfBuzz ............................... yesUsing system HarfBuzz ................ yesFontconfig ............................. yesImage formats:GIF .................................. yesICO .................................. yesJPEG ................................. yesUsing system libjpeg ............... yesPNG .................................. yesUsing system libpng ................ yesText formats:HtmlParser ........................... yesCssParser ............................ yesOdfWriter ............................ yesMarkdownReader ....................... yesUsing system libmd4c ............... noMarkdownWriter ....................... yesEGL .................................... yesOpenVG ................................. noOpenGL:Desktop OpenGL ....................... noOpenGL ES 2.0 ........................ yesOpenGL ES 3.0 ........................ yesOpenGL ES 3.1 ........................ yesOpenGL ES 3.2 ........................ yesVulkan ................................. yesSession Management ..................... yes
Features used by QPA backends:evdev .................................. yeslibinput ............................... yesINTEGRITY HID .......................... nomtdev .................................. yestslib .................................. yesxkbcommon .............................. yesX11 specific:XLib ................................. yesXCB Xlib ............................. yesEGL on X11 ........................... yes
QPA backends:DirectFB ............................... noEGLFS .................................. yesEGLFS details:EGLFS OpenWFD ........................ noEGLFS i.Mx6 .......................... noEGLFS i.Mx6 Wayland .................. noEGLFS RCAR ........................... noEGLFS EGLDevice ...................... yesEGLFS GBM ............................ yesEGLFS VSP2 ........................... noEGLFS Mali ........................... noEGLFS Raspberry Pi ................... noEGLFS X11 ............................ yesLinuxFB ................................ yesVNC .................................... yesXCB:Using system-provided XCB libraries .. yesXCB XKB .............................. yesXCB XInput ........................... noNative painting (experimental) ....... noGL integrations:GLX Plugin ......................... noEGL-X11 Plugin ..................... yes
Qt Sql:SQL item models ........................ yes
Qt Widgets:GTK+ ................................... noStyles ................................. Fusion Windows
Qt PrintSupport:CUPS ................................... yes
Qt Sql Drivers:DB2 (IBM) .............................. noInterBase .............................. noMySql .................................. noOCI (Oracle) ........................... noODBC ................................... yesPostgreSQL ............................. yesSQLite2 ................................ yesSQLite ................................. yesUsing system provided SQLite ......... noTDS (Sybase) ........................... yes
Qt Testlib:Tester for item models ................. yes

注意:
EGLFS EGLDevice, EGLFS GBM, EGL on x11的后面必须都是yes
EGLFS Raspberry Pi 后面是no是对的,因为它代表的是树莓派3以前的旧驱动(brcm),树莓派4不用的。

如果报错,可在config.log中查看报错信息,逐个排查。配置完成后,就可以make了。这里make -j4的数字一般是CPU核数目的两倍,表示同时可以执行4个编译命令。可以根据自己CPU的性能修改,尽量缩短编译时间,提高效率。

make -j4

然后:

make install

至此,qtbase就编译成功了。

注意,这里只编译了qtbase,还有很多其他的模块没有编译,而且其他模块之前存在相互依赖关系,需要按一定的先后顺序进行编译。以编译quickcontrols2为例:

由于qtquick2依赖于qtquick,而quick属于qtdeclarative,所以先编译qtdeclarative

cd ~/Work/raspi/qt-everywhere-src-5.14.2/qtdeclarative

用刚刚编译出来的qmake工具来配置。

~/Work/raspi/qt5pi-host/bin/qmake

make,会安装到~/Work/raspi/qt5pi中。

make -j4 && make install

再编译我们要的quickcontrols2,步骤一样。

cd ~/Work/raspi/qt-everywhere-src-5.14.2/qtquickcontrols2~/Work/raspi/qt5pi-host/bin/qmakemake -j4 && make install

最后把编译好的Qt安装到树莓派上去(要改成自己树莓派的IP地址)。

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

四、配置Qt Creator

打开Qt Creator,进入Tools→Options…→Devices
添加(Add…): Generic Linux Device
输入树莓派的用户名和ip地址,并选择用ssh私钥建立连接。具体方法,Click Me。
Tools→Options…→Kits→Compilers,Add添加交叉编译工具链(我的本来就有的,无需手动添加,如图。)
在这里插入图片描述
Tools→Options…→Kits→Debuggers,Add添加debugger
在这里插入图片描述
Tools→Options…→Kits→Qt Versions,Add添加qmake
在这里插入图片描述
Tools→Options…→Kits→Kits,Add并配置如下图(都选择刚刚配置的那些)。
在这里插入图片描述
保存退出,重启Qt Creator。

五、例程测试

在树莓派上配置环境变量
把以下内容追加到/etc/profile最后,可以根据需求自行修改。

# 存放我们自己编写的qt程序的路径
export PATH=$PATH:/home/pi/qt5  # eglfs屏幕物理尺寸,单位毫米
export QT_QPA_EGLFS_PHYSICAL_WIDTH=255
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=143# eglfs屏幕分辨率
export QT_QPA_EGLFS_WIDTH=1920
export QT_QPA_EGLFS_HEIGHT=1080# 其他
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH # 链接库路径
export QTDIR=/usr/local/qt5pi
export QT_QPA_FONTDIR=$QTDIR/lib/fonts 
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ 
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_HIDECURSOR=1
export QT_QPA_EGLFS_ALWAYS_SET_MODE="1" # 这个非常重要,我也不知道为啥,没有这条就不行
export QWS_MOUSE_PROTO=/dev/input/event0 # 触摸屏输入设备
export QML_IMPORT_PATH=$QTDIR/qml
export QML2_IMPORT_PATH=$QTDIR/qml

保存退出后重启树莓派。

编译一个例程
在Qt Creator中选择File→Open File or Project…
选择 [Qt Creator安装目录]/Examples/Qt-5.14.2/opengl/cube/cube.pro
修改cube.pro(删去原来的target.path,改成树莓派上放程序的路径)

target.path = /home/pi/qt5

左下角设备选择树莓派,然后点三角形运行。成功!

说明:
树莓派桌面下运行程序的方法:

cd ~/qt5
./cube --platform xcb

总结

主要参考:
https://zhuanlan.zhihu.com/p/138021025
https://wiki.qt.io/RaspberryPi2EGLFS

撒花✿✿ヽ(°▽°)ノ✿


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部