含泪研究两周,终于实现了在RK3399+ubuntu虚拟机的交叉编译,并带opengl es 和eglfs模块,最终在板子上跑起来交叉编译后的qt3d demo,亲测gpu使用正常。
tow weeks later……
含泪又研究两周,发现并没有完全成功,对不住了各位,还是把流程和问题说一说给大家参考吧:
手上有firefly的板子(自带qt5.9.3库,ubuntu桌面系统),toybrick的板子(自带qt5.11.3库,debain桌面系统)用于测试。
toybrick板子需要执行命令sudo toybrick-mali.sh link
才能链接gpu正常使用,详情参考链接
http://t.rock-chips.com/forum.php?mod=viewthread&tid=1378&highlight=opengl
gpu测试:
Glmark2 是一款比较出名的 GPU benchmark 测试程序,支持 OpenGL 2.0 和 OpenGL ES 2.0。在 Ubuntu 系统上可以直接通过 apt install 命令安装
#安装 sudo apt install glmark2
#运行 glmark2
图不截了,有一个3D的马在转圈圈
#查看gpu占用率 cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/load
0@200000000Hz
@前面的数值表示gpu占用率,如果一直为0,说明gpu没有用起来。
关于qt库的问题
->系统自带的qt库是定制版本的(可以良好的适配桌面系统,但功能有所阉割),怎么卸载都卸载不掉,强制删库桌面系统就起不来。
->自己交叉编译的qt库,拷贝到开发板,指定环境变量后,eglfs模块运行不起来,会报错初始化egl错误。(可能还是我比较菜,eglfs模块没有编译好)
->但系统自带的qt库支持eglfs模块,所以交叉编译后的可执行程序,用系统自带的库可以运行。
所以目前我们的现状就是:
用虚拟机交叉编译了qt的库,在虚拟机上用qtcreator可以开发编译程序,编译好的程序拷贝到板子上可以用板子自带qt库运行。也就是最终没有做目录中的第5步,只是实现了交叉编译,并没有实现qt移植。
关于eglfs模块的问题
为什么要用eglfs插件?因为带opengl加速的qt需要在该插件下才能正常运行。
别的插件行不行?wayland,xcb也可以,但我没有尝试过。
怎么用eglfs插件运行程序?(确保qt库有eglfs模块,目前板子自带的qt库是有的。如果自己交叉编译qt库,需要把eglfs模块编译出来)
方式1:环境变量指定export QT_QPA_PLATFORM=eglfs # 指定QPA平台
方式2:运行时候指定 ./example -platform eglfs
关于3399开发板自带的qt库阉割了什么功能
目前发现不能实现opengl多线程渲染,即qt自带demo中,"Scene Graph - Rendering FBOs in a thread" 这个例子不能正常运行
同时发现板子自带的qt include 目录中,没有<QtGui/qpa/qplatfromintegration.h>,甚至没有qpa这个文件夹目录,也没有相关的库
这让我们陷入了瓶颈,导致程序运行会卡,qt的opengl图形渲染和视频播放(用了QOpenGLWidget)同时放在主线程进行时,会卡的不得了
这个问题暂时没有解决,期待大神看到能指点一二
1.准备虚拟机及必备软件和库的安装
2.开发板挂载虚拟机,虚拟机共享主机文件夹
3.虚拟机安装交叉编译链
4.下载qt5.12.0源码、配置、及编译
5.编译好的qt库拷贝到开发板、开发板环境变量配置
6.运行编译好的qt程序
7.gpu使用率查看
目录里面的内容感觉其他教程里都有,有时间再详细更新吧,我只把第3,4步里面的配置贴出来给大家参考一下
主要流程参考链接
https://blog.csdn.net/hl1796/article/details/90205218
需要注意的点:
1)虚拟机上建立target目录,把开发板usr中的include和lib拷贝过来,注:目录结构最好和开发板的目录结构一样
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
#QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
QMAKE_LINK = aarch64-linux-gnu-g++
QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
# modifications to linux.conf
QMAKE_AR = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
QMAKE_NM = aarch64-linux-gnu-nm -P
QMAKE_STRIP = aarch64-linux-gnu-strip
# tell configure where to find opengl_es2 and egl
QMAKE_INCDIR_OPENGL_ES2 = /home/***/work/target/usr/include
QMAKE_LIBDIR_OPENGL_ES2 = /usr/aarch64-linux-gnu
QMAKE_LIBS_OPENGL_ES2 = -lEGL -lGLESv2 -lmali
QMAKE_INCDIR_EGL = /home/***/work/target/usr/include
QMAKE_LIBDIR_EGL = /usr/aarch64-linux-gnu
QMAKE_LIBS_EGL = -lEGL -lGLESv2 -lmali
#QMAKE_INCDIR += /home/***/work/target/usr/include
#QMAKE_LIBDIR += /usr/aarch64-linux-gnu
#QMAKE_LIBS += -lEGL -lGLESv2 -lmali
QT_QPA_DEFAULT_PLATFORM = eglfs #linuxfb
QMAKE_LIBS += -lrt
EGLFS_DEVICE_INTEGRATION = eglfs_mali
load(qt_config)
3)configure建立了一个文件auto.sh,运行auto.sh 完成configure,文件里内容如下
#!/bin/sh
./configure \
-prefix /usr/bin/qt5.12.0-arm64-eglx11 \
-sysroot /home/***/work/target \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-xcb \
-no-separate-debug-info \
-opengl es2 \
-egl \
-eglfs \
-recheck-all
4)这时候configure会出错
如果是opengl es的错误找不到库或头文件的错,请再仔细检查路径的设置
openGL ES系列…………yes
EGL…………………………yes
EGLFS……………………yes
EGLFS Mali………………yes
其中EGLFS Mali通常是失败的,如下图所示,查看config.log,发现找不到fbdev_window
在EGL头文件目录中增加软链,重新编译后成功
ln -s egl.h fbdev_window.h
其他的问题,缺什么库在板子上装什么库,然后拷贝到虚拟机target目录
5)有修改后,最好make distclean后,重新编译qt
这样应该就行了,编译好qt,配置qtcreator中 kit
把可执行程序拷贝到开发板运行的时候有几点注意
1,将开发板切换的纯终端运行alt+f1(切换回来用alt+f7)
2,执行时候我们通常用 ./example -platform eglfs执行,或者加环境变量指定用eglfs插件
亲测大部分qt opengl的demo可以运行,并且使用了gpu加速
含泪研究两周,终于实现了在RK3399+ubuntu虚拟机的交叉编译,并带opengl es 和eglfs模块,最终在板子上跑起来交叉编译后的qt3d demo,亲测gpu使用正常。目录1.准备虚拟机及必备软件和库的安装2.开发板挂载虚拟机,虚拟机共享主机文件夹3.虚拟机安装交叉编译链4.下载qt5.12.0源码、配置、及编译5.编译好的qt库拷贝到开发板、开发板环境变量配置6.运行编译好的qt程序7.gpu使用率查看这次一定要更新,不更新下个月胖三斤!...
qt5
.
12.0
静态资源包,不支持directx 12版本.因为大部分window7版本以下会无法打开
qt
应用.
使用
方法为:
1.打开最新版visualStudio。创建新工程不打开项目,选择安装
qt
-plugins.搜索
qt
. 然后执行安装,根据提示重启VS
2.上述安装完毕后,点击创建新的
qt
- quick project ,名字任意,选择我们解压的
qt
版本.
3. 环境选择x86 ,release版本
4. 右键工程,在代码生成中选择 MT
5.完毕,运行成功。
qt
quick应用静态编译和动态编译的区别。就是静态编译出来会将相关用到的
qt
核心依赖库随编译一起打包出来一个exe文件,无需引入
qt
core等dll。动态编译要手东windeoloy ,体积几百M,静态编译只需要10M不到
最近由于项目的需要,需要在aarch64 Ubuntu16.04中安装
QT5
,本来系统中自
带
了一个
qt5
,奈何项目要求必须是
qt5
.12的版本并且需要包含
opengl
和
egl
fs
的库,所以只能重新移植
QT5
.12到开发板中,下面把移植过程记录下。
下载
QT5
源码
下载地址:https://download.
qt
.io/archive/
qt
/
找到自己需要的版本进行下载。
图中标出来的就是源码下载链接。随便下载哪一个都行。下载后放入ubuntu(我用的Ubuntu 16.04)系统中进行解压。
主要是为了解决前面博客最后图片不能显示问题,所以博主决定沉下心来先把一些基础知识重新整理下,所以才有了前面三篇博客:
Ubuntu下的基本知识点(一)_jiug
es
hao的专栏-CSDN博客
Ubuntu下的基本知识点(二)_jiug
es
hao的专栏-CSDN博客
Ubuntu下源码编译OpenCV静态库及
使用
(勾选WITH_
QT
)_jiug
es
hao的专栏-CSDN博客
在此基础上,博主继续做了多次尝试,终于解决了此问题。过程中也参考stack Overflow上的解决方法,然而并没有什么作用,其
本文记录了
QT
交叉编译
并移植到开发板的过程,并在虚拟机上用
QT
creater 开发程序,到开发板上运行。其中重点解决了一些过程中的BUG和坑。
1、一个ubuntu系统的电脑(或虚拟机)
2、
QT
源代码软件包
qt
-everywhere-opensource-src-5.9.6.tar.xz
3、linaro
交叉编译
器
4、tslib
5、sqlite3
6、开发板根文件系统,其中包含了
OpenGL
ES
3的库文件和头文件。
一、
交叉编译
环境搭建
直接参考文章linux_ubuntu_