100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 一 在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)

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

时间:2019-05-14 20:42:32

相关推荐

一 在树莓派和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五、例程测试总结

目标

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

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

一、环境介绍

硬件设备

树莓派 Raspberry Pi 4B,镜像版本为-01-11-raspios-buster-armhf-full;

PC端的Ubuntu18.04(在VMware 16.0 Pro虚拟机上运行)。软件版本

Qt 5.14.2

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

!!注意!!

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

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

如果直接执行

sudo rpi-update

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

Click Me,链接至本地更新方法

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

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

先更新。

sudo apt-get updatesudo 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-x11sudo apt-get build-dep libqt5gui5sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0sudo 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-*devsudo 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-devsudo apt install ninja-build libdrm-dev

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

sudo mkdir /usr/local/qt5pi # 用来安装qt运行库sudo chown -R pi:pi /usr/local/qt5pimkdir /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/raspimkdir ~/Work/raspi/cross-compile-toolcd ~/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++ -vsudo 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/raspirsync -avz pi@192.168.31.188:/lib sysrootrsync -avz pi@192.168.31.188:/usr/include sysroot/usrrsync -avz pi@192.168.31.188:/usr/lib sysroot/usrrsync -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/raspiwget /riscv/riscv-poky/master/scripts/sysroot-relativelinks.pychmod +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

这里是我的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 ............................ libsQt 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 ................................. yesSupport enabled for:Using pkg-config ....................... yesudev ................................... yesUsing system zlib ...................... yesZstandard support ...................... noQt Core:DoubleConversion ....................... yesUsing system DoubleConversion ........ yesGLib ................................... yesiconv .................................. noICU .................................... yesBuilt-in copy of the MIME database ..... yesTracing backend ........................ <none>Logging backends:journald ............................. nosyslog ............................... noslog2 ................................ noPCRE2 .................................. yesUsing system PCRE2 ................... yesQt 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 ................................. noQt 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 ..................... yesFeatures used by QPA backends:evdev .................................. yeslibinput ............................... yesINTEGRITY HID .......................... nomtdev .................................. yestslib .................................. yesxkbcommon .............................. yesX11 specific:XLib ................................. yesXCB Xlib ............................. yesEGL on X11 ........................... yesQPA 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 ..................... yesQt Sql:SQL item models ........................ yesQt Widgets:GTK+ ................................... noStyles ................................. Fusion WindowsQt PrintSupport:CUPS ................................... yesQt Sql Drivers:DB2 (IBM) .............................. noInterBase .............................. noMySql .................................. noOCI (Oracle) ........................... noODBC ................................... yesPostgreSQL ............................. yesSQLite2 ................................ yesSQLite ................................. yesUsing system provided SQLite ......... noTDS (Sybase) ........................... yesQt 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/raspirsync -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=255export QT_QPA_EGLFS_PHYSICAL_HEIGHT=143# eglfs屏幕分辨率export QT_QPA_EGLFS_WIDTH=1920export QT_QPA_EGLFS_HEIGHT=1080# 其他export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH # 链接库路径export QTDIR=/usr/local/qt5piexport QT_QPA_FONTDIR=$QTDIR/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ export QT_QPA_PLATFORM=eglfsexport QT_QPA_EGLFS_HIDECURSOR=1export QT_QPA_EGLFS_ALWAYS_SET_MODE="1" # 这个非常重要,我也不知道为啥,没有这条就不行export QWS_MOUSE_PROTO=/dev/input/event0 # 触摸屏输入设备export QML_IMPORT_PATH=$QTDIR/qmlexport 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

总结

主要参考:

/p/138021025

https://wiki.qt.io/RaspberryPi2EGLFS

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。