QML运行很卡以及RK3568的QT交叉编译(带OpenGL库与QML)

前言

由于供应商提供的qt库不支持OpenGL,虽说用QML编译出来的程序也能运行,但是效果非常卡,供应商要我们换3588,但是我认为3568运行一个简单的QML绝不应该卡成PPT,随后做上位机界面的同事发现编译时会报无OpenGL的错,所以我们怀疑是由于没有调用OpenGL库的原因导致的,所以决定自己下QT源码重新编译一个带OpenGL的套件。

在网上查阅了大量文章,参照很多文档开始编译,在qt源码config阶段各种报错,由于这些文章都只讲了要这么做,而未说明为什么要这么做,所以一直编译不成功,折腾了两天之后,最终参照国外一树莓派的固件制作视频1,终于是摸清楚了各环节的作用,特此写文章记录一下,很多地方是自己的理解,有理解的不对的地方,也希望大佬们指正。

一、准备工作

想要成功交叉编译,自然是要做一些准备工作,我在这里简单说一下,有些网上一查一大把的,我就不细说了。

  1. 准备交叉编译器,RK3568使用的是aarch64-linux-gnu编译器,可以去linaro官网下。这个一般供应商也会提供。
    下载地址是:https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/
  2. 下载QT源码,我使用的是QT5.14.2,其他应该也大差不差。
  3. 准备虚拟机,我用的是ubuntu18.04,虚拟机网络配置,能ping通开发板,这个应该都能做到。

二、开发板准备工作

应该是qt编译OpenGL时,需要用到开发板的库,这也是最开始不明白为什么很多带OpenGL的qt交叉编译的文章里都会提到sysroot,sysroot的作用应该就是在虚拟机里实现开发板的环境。
废话少说,开发板联网,安装以下库(由于我是root用户登录的开发板,所以就没有加sudo了):

apt-get update
apt-get upgrade
apt-get build-dep qt5-qmake
apt-get install libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev
apt-get install libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev
apt-get install libvpx-dev libsnappy-dev libnss3-dev
apt-get install "^libxcb.*"
apt-get install libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev libavcodec-dev libavformat-dev libswscale-dev
apt-get install gstreamer-tools libx11-dev libglib2.0-dev
apt-get install libx11-dev libglib2.0-dev
apt-get install freetds-dev libpq-dev libiodbc2-dev firebird-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1
apt-get install libxcb-sync1 libxcb-sync-dev libxcb-render-util0 libxcb-render-util0-dev libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev
apt-get install libxcb-glx0-dev libxi-dev libdrm-dev libssl-dev libxcb-xinerama0 libxcb-xinerama0-dev
apt-get install libatspi-dev libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libfontconfig1-dev
apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libfontconfig1-dev
apt-get install libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libnss3-dev libdirectfb-dev libaudio-dev
a

以上库我是照搬那个视频里的,具体哪些不需要的,我也没有细究,有兴趣的同学可以具体研究研究。

三、虚拟机准备工作

3.1 虚拟机里也要安装以下环境

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install gcc git bison python gperf pkg-config
sudo apt-get install libclang-dev
sudo apt-get install mesa-common-dev
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev

3.2 将开发板上的运行环境拷贝到虚拟机中

随便找个目录,例如我是在/opt/qt5rk目录下新建一个sysroot目录,我一开始以为sysroot是个什么工具,后来才意识到,只是需要一个目录来存放开发板的各种库而已

使用rsync将开发板的/usr/lib与/usr/include目录拷贝到虚拟机中,sysroot目录我是放在了/opt/qt5rk下的
rsync -avz root@192.168.3.105:/usr/lib sysroot/usr
rsync -avz root@192.168.3.105:/usr/include sysroot/usr
供应商给我的固件里,并没有/lib目录,实际上lib目录就是/usr/lib的软链接,但是qt还是会去/lib下找库,所以我们还得创建一个软链接
ln -s sysroot/usr/lib lib
至此,你的sysroot目录下应该有两个文件夹,一个lib,一个usr,usr底下又有两个,lib和include目录。

3.3 处理拷贝后的链接文件,在sysroot目录同级目录下新建一个sysroot.py脚本

 #!/usr/bin/env python
import sys
import os

#Take a sysroot directory and turn all the abolute symlinks and turn them into
#relative ones such that the sysroot is usable within another system.

if len(sys.argv) != 2:
    print("Usage is " + sys.argv[0] + "<directory>")
    sys.exit(1)

topdir = sys.argv[1]
topdir = os.path.abspath(topdir)

def handlelink(filep, subdir):
    link = os.readlink(filep)
    if link[0] != "/":
        return
    if link.startswith(topdir):
        return
    #print("Replacing %s with %s for %s" % (link, topdir+link, filep))
    print("Replacing %s with %s for %s" % (link, os.path.relpath(topdir+link, subdir), filep))
    os.unlink(filep)
    os.symlink(os.path.relpath(topdir+link, subdir), filep)

for subdir, dirs, files in os.walk(topdir):
    for f in files:
        filep = os.path.join(subdir, f)
        if os.path.islink(filep):
            #print("Considering %s" % filep)
            handlelink(filep, subdir)

再运行运行这个脚本

chmod +x sysroot.py
./sysroot.py sysroot

3.4 配置QT

解压QT源码文件,修改/qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-aarch64-gnu-g++路径下的qmake.conf文件,如下文

#
# qmake configuration for building with aarch64-linux-gnu-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)


QMAKE_CFLAGS_ISYSTEM = -I
QMAKE_LFLAGS           += -Wl,-rpath-link,$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu


QMAKE_LIBS_EGL         += -lEGL
QMAKE_LIBS_OPENGL_ES2  += -lGLESv2 -lEGL

QMAKE_INCDIR_EGL        = $$[QT_SYSROOT]/usr/include \
						$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu

QMAKE_LIBDIR_OPENGL_ES2 = $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu
QMAKE_LIBDIR_EGL        = $$QMAKE_LIBDIR_OPENGL_ES2


# modifications to g++.conf
QMAKE_CC                = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
QMAKE_CXX               = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK              = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB        = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

# modifications to linux.conf
QMAKE_AR                = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY           = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-objcopy
QMAKE_NM                = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm -P
QMAKE_STRIP             = /opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-strip
load(qt_config)

其实主要就是指定EGL和GLES2这两个库的路径,QT应该是要用到这两个库来做链接。

四、开始编译

然后就可以配置QT了,有的人也专门做了个脚本,但是我就懒得做了,直接上命令

./configure -opengl es2 -xplatform linux-aarch64-gnu-g++ -device-option CROSS_COMPILE=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -sysroot /opt/qt5rk/sysroot -prefix /opt/qt5rk/qt5build -opensource -confirm-license -skip qtscript -skip qtdatavis3d -skip macextras -nomake examples -make libs -pkg-config -no-use-gold-linker -tslib -v

其中-opengl es2表示要编译OpenGL ES2,因为貌似RK3568的GPU不支持完整的OpenGL,所以用的是ES2,专门给嵌入式设备用的。
-xplatform linux-aarch64-gnu-g++表示使用这个平台,我们之前编辑的qmake.conf文件就是这个平台的。
CROSS_COMPILE=xxx指定交叉编译器路径,但其实qmake.conf里指定了,这里应该不用再指定。
-sysroot /opt/qt5rk/sysroot 这里就是指定开发板那些库的路径地址,指到sysroot这一层就可以,底下的他会自动去找
-prefix /opt/qt5rk/qt5build 这里是指定生成的qt套件存放位置,注意,这个/opt并不是你虚拟机里的opt目录,而是sysroot里的/opt,所以最后编译完了,不要去你虚拟机里的opt目录里找,是找不到的,去sysroot底下找。
然后就是-skip blabla,跳了一些qt库,我用不着,所以就跳了,注意,千万别跳declarative库,跳了这个库,编出来的qt套件就没有qml了,别问我为什么知道,血泪史。。。
-tslib 是加入了ts触摸库,我也不知道具体有啥用,能加也就加上了,这里我没有像有些文章里一样下tslib源码去编译,是因为我发现直接在开发板上用apt能获取到ts库,配置时也不会报错。
其他的参数配置,我也没有具体深究,有兴趣的同学可以研究研究。

先用上面的./configure,配置完没问题,应该能在最后看到以下内容

>  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
  .
  blabla...
  .
Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into '/opt/qt5rk/sysroot/opt/qt5rk/qt5build'.

这里也说明了,最终的生成位置是/opt/qt5rk/sysroot/opt/qt5rk/qt5build。
然后再检查以下要的OpenGL库是否是yes,如果是yes,说明你第一步就已经成功了
如果没成功,就去源码路径下找config.log,看看是啥问题。慢慢耐心找,总能解决的

然后就是make,如果你cpu多,可以用-jx提升速度,例如8核就make -j8
我这里不出意外的出意外了,报错了,因为我开发板原先装过qt,所以sysroot/usr/lib路径下有qt库,但是我新编译的qt又不需要这些库,有些链接不一样,会提示找不到blabla,我的解决办法就是把原来的qt库删了,直接一个rm libQt*,简单粗暴,删了之后就能编译过了。

编译完了之后就是make install,生成qt套件了,这一步一般应该不容易出错把。

make install完成后,恭喜你,你就拥有一个arm环境下运行的qt套件了,快去领取你的胜利奖励吧,在/opt/qt5rk/sysroot/opt/qt5rk/qt5build路径下,能看到包括bin,doc,lib等等套件了,其中bin里的qmake,就是你要在qtcreator里添加的qt套件,怎么添加我相信你们应该都会了。

五、结束语

把整个qt5build文件夹复制到开发板里,添加上链接路径(ldconfig),就可以愉快的运行你的qml程序啦,我试了之后,发现加上OpenGL库之后,确实流畅很多了。

  • 21
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值