树莓派学习::qt5.10.1交叉编译【带opengl ES2】(armv8 64位)

测试环境(与树莓派学习::qt5交叉编译(armv8 64位)一致)
(1)硬件设备

msi笔记本,I7-4710H,16G内存
树莓派3b+,armv8(64位),16Gsd卡
(2)系统环境

笔记本:ubuntu16.04 x64位
树莓派3b+:debian9 x64位
建议 :如果要交叉编译 32位的程序,笔记本系统最好用32位,相反,如果要交叉编译出64位程序,笔记本系统 用64位,这样可以免去很多奇怪的报错

环境配置及编译过程
一、树莓派环境配置

(1)由于还是用那个非官方的64位系统,就不再赘述系统的安装步骤了

(2)安装opengl

sudo apt-get install libgles2-mesa

sudo apt-get install libgles2-mesa-dev
(3)安装编译QT所需的环境【尽管我们不是在开发板上编译QT,但是我们需要这些库来构建sysroot】

sudo apt-get install libxcb-xinerama0-dev

sudo apt-add-repository ppa:u-szeged/sedkit

sudo apt-get update

sudo apt-get install sedkit-env-qtwebkit

sudo apt-get install build-essential perl python git

sudo apt-get install libx11-dev libxcb1-dev libxkbcommon-x11-dev libx11-xcb-dev libxext-dev

sudo apt-get install flex bison gperf libicu-dev libxslt-dev ruby

sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev libfontconfig1-dev libcap-dev libxtst-dev libpulse-dev libudev-dev libpci-dev libnss3-dev libasound2-dev libxss-dev libegl1-mesa-dev gperf bison

sudo apt-get install libbz2-dev libgcrypt11-dev libdrm-dev libcups2-dev libatkmm-1.6-dev

sudo apt-get install libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
(4)检查系统的编译器版本

二、笔记本(ubuntu16.04)环境配置

(1)交叉编译器下载

https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/

下载下图两个东西:

一个是编译器,一个是sysroot

(2)配置交叉编译器

不赘述,可参见 树莓派学习::qt5交叉编译(armv8 64位). 中的配置过程

(3)我们还下了另外一个东西,就是sysroot

简述一下这个东西的作用:用来构造文件系统,我们还需要把开发板上的opt、lib、usr等目录覆盖上去,二者合成一个文件系统,用来提供给交叉编译时编译器寻找头文件.h和库文件.so等东西用的。这样才能提供一个基本与目标开发板一致的环境,给出这个环境之后,编译时找头文件就不在笔记本(ubuntu16.04)的环境找了,只在sysroot这个目录里面找。

1)找个地方,创个目录

mkdir pi pi/sysroot
2)将下载下来的东西解压到sysroot目录下,效果如下:

3)取出树莓派sd卡,在sd卡的rootfs目录下,将lib、opt、usr/include、usr/lib目录的东西覆盖到这个/home/msi/pi/sysroot的对应目录。

选择合并、遇到相同的选择覆盖即可

【只要想着要构造出开发板的文件环境,你就知道怎么办了】

4)复制完成之后,回到pi目录下,新建一个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] + “”)
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)
5)保存后,给权限

sudo chmod +x sysroot.py
6)在pi目录下,执行如下,用来解决该目录下的符号链接问题

./sysroot.py sysroot
7)到这里,就基本环境配置完成

三、编译QT

(1)下载源码,这里我要编译的版本是qt5.10.1

http://download.qt.io/archive/qt/

选择对应的源码下载即可

(2)将源码解压,位置随意

(3)进入解压目录,新建一个autoconfig.sh文件,用来修改配置参数,内容如下

其中,-prefix 后的路径为输出路径,但由于我们给了sysroot这个路径,所以最终的输出路径为sysroot/prefix,即我们最终的编译结果在/home/msi/pi/sysroot/home/msi/arm/qt5101_64/qt_sdk,这里
-sysroot为我们刚刚构建开发板文件系统的路径
-linuxfb表示编译这个插件,这个是软件渲染的插件,用于显示qtgui程序
-eglfs 为硬件渲染插件,用这个运行程序,将会强制程序全屏化
-openg es2表示编译带opengl es2的qt
#!/bin/sh
./configure -prefix /home/msi/arm/qt5101_64/qt_sdk
-verbose
-opensource
-release
-confirm-license
-xplatform linux-arm-gnueabi-g++
-shared
-qt-zlib
-qt-libjpeg
-qt-libpng
-make libs
-linuxfb
-eglfs
-no-cups
-no-iconv
-no-pch
-no-opengl
-opengl es2
-no-openssl
-nomake examples
-sysroot /home/msi/pi/sysroot
(4)从qt源码根目录中,进入

1)修改qmake.conf文件

QMAKE_INCDIR_OPENGL[_ES2]、QMAKE_LIBDIR_OPENGL[_ES2]、QMAKE_LIBS_OPENGL[_ES2]这些用来指定opengl es2的头文件和库文件等,路径可根据自身实际修改,关键要找到opengl es2和egl的头文件库文件路径
然后将编译器改成刚刚在前面配置的交叉编译器,(看不懂的请参见: 树莓派学习::qt5交叉编译(armv8 64位).中的描述)即修改成下图的框框内容:

2)修改后的内容如下

qmake configuration for building with arm-linux-gnueabi-g++

MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QMAKE_INCDIR_POST +=
KaTeX parse error: Undefined control sequence: \ at position 26: …T]/usr/include \̲ ̲ [QT_SYSROOT]/usr/include/aarch64-linux-gnu

QMAKE_LIBDIR_POST +=
KaTeX parse error: Undefined control sequence: \ at position 22: …SROOT]/usr/lib \̲ ̲ [QT_SYSROOT]/lib/aarch64-linux-gnu
$$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu

QMAKE_RPATHLINKDIR_POST +=
KaTeX parse error: Undefined control sequence: \ at position 22: …SROOT]/usr/lib \̲ ̲ [QT_SYSROOT]/usr/lib/aarch64-linux-gnu
KaTeX parse error: Undefined control sequence: \ at position 46: …inux-gnu/tegra \̲ ̲ [QT_SYSROOT]/lib/aarch64-linux-gnu

QMAKE_INCDIR_OPENGL[_ES2] +=
KaTeX parse error: Undefined control sequence: \ at position 22: …SROOT]/include \̲ ̲ [QT_SYSROOT]/include/EGL
KaTeX parse error: Undefined control sequence: \ at position 28: …/include/GLES2 \̲ ̲ [QT_SYSROOT]/include/GLES3
KaTeX parse error: Undefined control sequence: \ at position 26: …T]/include/KHR \̲ ̲ [QT_SYSROOT]/usr/include
KaTeX parse error: Undefined control sequence: \ at position 30: …sr/include/EGL \̲ ̲ [QT_SYSROOT]/usr/include/GLES2
KaTeX parse error: Undefined control sequence: \ at position 32: …/include/GLES3 \̲ ̲ [QT_SYSROOT]/usr/include/KHR

QMAKE_LIBDIR_OPENGL[_ES2] +=
KaTeX parse error: Undefined control sequence: \ at position 45: …x-gnu/mesa-egl \̲ ̲ [QT_SYSROOT]/lib/aarch64-linux-gnu/tegra-egl
KaTeX parse error: Undefined control sequence: \ at position 38: …64-linux-gnu \̲ ̲ [QT_SYSROOT]/usr/lib/aarch64-linux-gnu/mesa-egl
KaTeX parse error: Undefined control sequence: \ at position 50: …-gnu/tegra-egl \̲ ̲ [QT_SYSROOT]/usr/lib/aarch64-linux-gnu

QMAKE_LIBS_OPENGL[_ES2] += -lEGL -lGLESv2

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
load(qt_config)
(5)开始配置qt编译参数,即在qt源码根目录下,运行autoconfig.sh即可

sudo chmod +x autoconfig.sh

./autoconfig.sh
配置结果有可能会提示opengl function test failed ,大概像这样

#opengl es2头文件、库文件配置有错误:

ERROR: Feature ‘opengles2’ was enabled, but the pre-conditio

#EGL 头文件或库文件路径配置有错误:

ERROR: Feature ‘eglfs’ was enabled, but the pre-conditio

这时候 ,可以在qt源码根目录下找到config.log,这个是configure配置时生成的日志,慢慢找是什么错误即可。

重新修改完后,还不能直接重新运行autoconfig.sh,需删除之前的配置文件config.cache和config.log,即删除下图的两个文件:

直到配置成功,大概会有如下输出:

(6)开始编译

make -j4
编译过程中,如果因出错而停止,而错误信息又看不到的时候,可再次运行一次make,这时候错误信息就很容易找到了

如果提示缺少什么头文件、库文件这些,查到对应问题后,

(1)可以将sd卡插回到板子上,用apt-get进行安装之后,

(2)重新配置sysroot,(即重新拷贝lib、usr/include、usr/lib等文件夹到sysroot对应目录),

(3)然后重新修正符号链接(即再次运行 ./sysroot.py sysroot)

(4)重新回到qt源码根目录,接着make -j4即可继续编译

编译完成输出:

(7)编译完成之后,运行make install

make install
(8)全部完成之后,可以看到生成的东西在sysroot目录下的prefix路径,即

四、开发板再配置

(1)将编译后的结果复制到开发板/home/pi目录下,我的目录是

编译结果的路径如下:/home/msi/pi/sysroot/home/msi/arm/qt5101_64

复制到树莓派下:/home/pi/qt5101_64

(2)开发板qt库路径配置

配置Qt的运行时环境,打开/etc/profile,在最后一行输入一下内容:

export QTDIR=/home/pi/qt5101_64/qt_sdk #qtsdk在系统上的路径
export QT_QPA_FONTDIR= Q T D I R / l i b / f o n t s e x p o r t Q T Q P A P L A T F O R M P L U G I N P A T H = QTDIR/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH= QTDIR/plugins/
export LD_LIBRARY_PATH= Q T D I R / l i b : QTDIR/lib: LD_LIBRARY_PATH
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0 #framebuffer驱动
export QWS_MOUSE_PROTO=/dev/input/event0
如果配置了qml,要运行qtquick程序,还要加上下面的配置(否则会提示QTQUICK模块没有安装,具体可参见:

https://lemirep.wordpress.com/2013/06/01/deploying-qt-applications-on-linux-and-windows-3/):

export QML_IMPORT_PATH= Q T D I R / q m l e x p o r t Q M L 2 I M P O R T P A T H = QTDIR/qml export QML2_IMPORT_PATH= QTDIR/qml
(3)刷新配置

source /etc/profile
(4)库文件配置

1)在/etc/ld.so.conf.d/目录下,新建一个qt5.conf

sudo mkdir /etc/ld.so.conf.d/qt5.conf
2)加入qt_sdk的路径,即

/home/pi/qt5101_64/qt_sdk/lib/
3)刷新

sudo ldconfig

五、 测试

测试结果:

编译qt成功
笔记本下编译程序有的会报错提示找不到stdlib.h,有的程序又没报错
将交叉编译的程序复制到开发板
检查库文件是否都齐全:
ldd 文件名
运行文件,可直接./文件名运行,也可后面加参数 -platform linuxfb或者 -platform eglfs,来指定平台运行
运行结果:程序打开后,只留下程序界面的残影,鼠标滑动就没了。。。可能 是该系统 不支持opengl?

发布了206 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43248127/article/details/104077645
今日推荐