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

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

本系列导航

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


目标

  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 [email protected]:/lib sysroot
rsync -avz [email protected]:/usr/include sysroot/usr
rsync -avz [email protected]:/usr/lib sysroot/usr
rsync -avz [email protected]:/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/raspiqt-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/sysroot sysroot的路径
-prefix /usr/local/qt5pi Qt在树莓派中的路径
-extprefix ~/Work/raspi/qt5pi PC上的交叉编译后Qt的路径(这个目录下的内容最终会被放到树莓派上)
-hostprefix ~/Work/raspi/qt5pi-host 在PC上交叉编译Qt工程的工具存放的位置(里面有qmake)

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

Build options:
  Mode ................................... release
  Optimize release build for size ........ no
  Building shared libraries .............. yes
  Using C standard ....................... C11
  Using C++ standard ..................... C++17
  Using ccache ........................... no
  Using new DTAGS ........................ yes
  Relocatable ............................ yes
  Using precompiled headers .............. yes
  Using LTCG ............................. no
  Target compiler supports:
    NEON ................................. yes
  Build parts ............................ libs
Qt modules and options:
  Qt Concurrent .......................... yes
  Qt D-Bus ............................... yes
  Qt D-Bus directly linked to libdbus .... yes
  Qt Gui ................................. yes
  Qt Network ............................. yes
  Qt Sql ................................. yes
  Qt Testlib ............................. yes
  Qt Widgets ............................. yes
  Qt Xml ................................. yes
Support enabled for:
  Using pkg-config ....................... yes
  udev ................................... yes
  Using system zlib ...................... yes
  Zstandard support ...................... no
Qt Core:
  DoubleConversion ....................... yes
    Using system DoubleConversion ........ yes
  GLib ................................... yes
  iconv .................................. no
  ICU .................................... yes
  Built-in copy of the MIME database ..... yes
  Tracing backend ........................ <none>
  Logging backends:
    journald ............................. no
    syslog ............................... no
    slog2 ................................ no
  PCRE2 .................................. yes
    Using system PCRE2 ................... yes
Qt Network:
  getifaddrs() ........................... yes
  IPv6 ifname ............................ yes
  libproxy ............................... no
  Linux AF_NETLINK ....................... yes
  OpenSSL ................................ yes
    Qt directly linked to OpenSSL ........ no
  OpenSSL 1.1 ............................ yes
  DTLS ................................... yes
  OCSP-stapling .......................... yes
  SCTP ................................... no
  Use system proxies ..................... yes
  GSSAPI ................................. no
Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ yes
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ yes
  Fontconfig ............................. yes
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... yes
    PNG .................................. yes
      Using system libpng ................ yes
  Text formats:
    HtmlParser ........................... yes
    CssParser ............................ yes
    OdfWriter ............................ yes
    MarkdownReader ....................... yes
      Using system libmd4c ............... no
    MarkdownWriter ....................... yes
  EGL .................................... yes
  OpenVG ................................. no
  OpenGL:
    Desktop OpenGL ....................... no
    OpenGL ES 2.0 ........................ yes
    OpenGL ES 3.0 ........................ yes
    OpenGL ES 3.1 ........................ yes
    OpenGL ES 3.2 ........................ yes
  Vulkan ................................. yes
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... yes
  INTEGRITY HID .......................... no
  mtdev .................................. yes
  tslib .................................. yes
  xkbcommon .............................. yes
  X11 specific:
    XLib ................................. yes
    XCB Xlib ............................. yes
    EGL on X11 ........................... yes
QPA backends:
  DirectFB ............................... no
  EGLFS .................................. yes
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... yes
    EGLFS GBM ............................ yes
    EGLFS VSP2 ........................... no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no
    EGLFS X11 ............................ yes
  LinuxFB ................................ yes
  VNC .................................... yes
  XCB:
    Using system-provided XCB libraries .. yes
    XCB XKB .............................. yes
    XCB XInput ........................... no
    Native painting (experimental) ....... no
    GL integrations:
      GLX Plugin ......................... no
      EGL-X11 Plugin ..................... yes
Qt Sql:
  SQL item models ........................ yes
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows
Qt PrintSupport:
  CUPS ................................... yes
Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. no
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. yes
  SQLite2 ................................ yes
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (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/qmake

make -j4 && make install

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

cd ~/Work/raspi
rsync -avz qt5pi [email protected]:/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

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

Supongo que te gusta

Origin blog.csdn.net/weixin_37789780/article/details/122229806
Recomendado
Clasificación