树莓派学习::qt5.10.1交叉编译【带opengl ES2】到非官方64位系统

2023-05-16

qt5.10.1交叉编译【带opengl ES2】(armv8 64位)


本次交叉编译是树莓派学习::qt5交叉编译(armv8 64位).的升级版,这次编译带opengl Es2的qt,原因是为了可以在树莓派上运行QtQuick2的程序。

结果:编译倒是编译出来了,但是程序在目标板上跑不了,目测原因是该64位系统不支持opengl(或者说驱动没弄对)。可以利用xcb运行,只是比较慢,因为没有了物理的opengl驱动支持,只有mesa的opengl了,毕竟是非官方系统。以linuxfb运行程序时,程序打开,界面也有了,但只是残影,鼠标晃一下就没了,产生这个情况的原因是qt5.9对linuxfb做出了修改,qt5.9之后linuxfb只能在纯命令行下打开程序显示gui,否则会花屏。。还不如直接用xcb。

虽然是半成品,但是这个过程对我的下一步(qt5.10.1交叉编译到树莓派官方系统)有很大帮助。


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

(1)硬件设备

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

(2)系统环境

  • 笔记本:ubuntu16.04 x64位
  • 树莓派3b+:debian9 x64位 

 

环境配置及编译过程 

一、树莓派环境配置

(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] + "<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)

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 += \
    $$[QT_SYSROOT]/usr/include \
    $$[QT_SYSROOT]/usr/include/aarch64-linux-gnu
 
QMAKE_LIBDIR_POST += \
    $$[QT_SYSROOT]/usr/lib \
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu \
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu
 
QMAKE_RPATHLINKDIR_POST += \
    $$[QT_SYSROOT]/usr/lib \
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu \
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/tegra \
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu
    
QMAKE_INCDIR_OPENGL[_ES2] += \
    $$[QT_SYSROOT]/include \
    $$[QT_SYSROOT]/include/EGL \
    $$[QT_SYSROOT]/include/GLES2 \
    $$[QT_SYSROOT]/include/GLES3 \
    $$[QT_SYSROOT]/include/KHR \
    $$[QT_SYSROOT]/usr/include \
    $$[QT_SYSROOT]/usr/include/EGL \
    $$[QT_SYSROOT]/usr/include/GLES2 \
    $$[QT_SYSROOT]/usr/include/GLES3 \
    $$[QT_SYSROOT]/usr/include/KHR
 
QMAKE_LIBDIR_OPENGL[_ES2] += \
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu/mesa-egl \
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu/tegra-egl \
    $$[QT_SYSROOT]/lib/aarch64-linux-gnu   \
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-gnu/mesa-egl \
    $$[QT_SYSROOT]/usr/lib/aarch64-linux-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=$QTDIR/lib/fonts 
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ 
export LD_LIBRARY_PATH=$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=$QTDIR/qml
 export QML2_IMPORT_PATH=$QTDIR/qml

(3)刷新配置

source /etc/profile

(4)库文件配置

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

sudo gedit /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?

(1)关于提示#include_next<stdlib.h>no such file stdlib.h 的解决方案:

如果构建时,提示#include_next<stdlib.h>找不到 stdlib.h文件,那么,可尝试在.pro文件中加入一行:

QMAKE_CFLAGS_ISYSTEM=

相关可参见:https://github.com/voidlinux/void-packages/issues/5254 

 

(2)运行测试

1)了解到qt5.9后关于linuxfb渲染插件的变化后,我重新尝试使用linuxfb运行

2)在xcb渲染插件下运行,速度较慢,但是可以完美显示qtquick2的程序,可能用了xcb调用了mesa的opengl

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派学习::qt5.10.1交叉编译【带opengl ES2】到非官方64位系统 的相关文章

  • vnc连接不上,vnc连接不上是为什么?原因详解

    vnc连接不上的原因 xff0c 服务器作为网站建设的常用设备 xff0c 在服务器运行过程中起到举足轻重的作用 用户在选择服务器是常用的方式有服务器租用 虚拟主机租用以及服务器托管 xff0c 通过进行文件以及数据的下载 上传等实现网站的
  • window10安装vnc无法使用,window10安装vnc无法使用的原因和解决办法

    window10安装vnc无法使用的原因 xff0c 服务器作为网站建设的常用设备 xff0c 在服务器运行过程中起到举足轻重的作用 用户在选择服务器是常用的方式有服务器租用 虚拟主机租用以及服务器托管 xff0c 通过进行文件以及数据的下
  • 企业信息化技术架构展望

    企业用户慢慢的从前期选用一些同行业成功的项目案例来复制 xff0c 或者选用一些知名的咨询公司提出的行业内通用方案 xff0c 转型为自己主动认真思考什么是自己需求 xff0c 什么是真正适合自己的信息化之路 做为企业信息技术架构设计 xf
  • Errors were encountered while processing: google-chrome-stable

    转自 xff1a http omtlab com errors were encountered while processing google chrome stable Many people facing this issue whi
  • virtualbox 命令

    VBoxManage命令详解 xff08 一 xff09 本人对vboxmange命令按我个人的理解作了解释 xff0c 由于本人水平有限难免有错误的地方 xff0c 希望大家帮我指正 VBoxManage v version 显示virt
  • 基于Springboot的物业管理系统_代码

    下载地址 1 1 课题背景 目的及意义 1 1 1 课题背景 互联网 43 改变着我们的生活 xff0c 在传统的社区物业服务领域 xff0c 在服务业主 提升社区服务 质量方面 xff0c 如何与互联网融合 xff1f 顶级互联网技术团队
  • eclips运行generatorConfig.xml文件生成代码

    描述 xff1a 如何通过eclips工具来运行 generatorConfig xml 文件来自动生成代码并获取数据 xff08 类似于mybaits逆向生成 xff09 xff1f mybatis generator generate
  • Spring源码(4)Context篇之AbstractApplicationContext(下)

    上一篇 Spring源码 4 Context篇之AbstractApplicationContext xff08 上 xff09 讲解了Spring的AbstractApplicationContext类refresh 方法 xff0c 前
  • java多线程 一个生产者和多个消费者

    生产者和消费者模式是面试时很容易被问到的一类题 xff0c 在平常的开发中也经常碰到 xff0c 比如在网游开发中 xff1a 用一个线程把收到的字节数据封装起来写到一个队列中 xff0c 然后用一个或多个线程从该队列中把数据读取出来再分发
  • Python最强装逼神技!微信远程控制电脑,想让你电脑关机就关机!

    今天带给大家一个非常有意思的 python 程序 xff0c 基于 itchat 实现微信控制电脑 你可以通过在微信发送命令 xff0c 来拍摄当前电脑的使用者 xff0c 然后图片会发送到你的微信上 甚至你可以发送命令来远程关闭电脑 程序
  • JAVA 在linux下面生成验证码异常问题

    应用部署到Linux下 xff0c 结果首页登录的验证码显示不出来 该验证码是用java的图片包来处理图片的 xff0c 后台日志报错 xff1a java lang NoClassDefFoundError sun awt X11Grap
  • 【PowerShell 一天一练】 3. 调用winrar解压

    如果你安装了 winrar 且安装在对应下面的路径 xff0c 可以尝试一下下面的代码 xff08 事实上我也是 copy 并修改自网上的代码 xff09 unrar 61 c Program files winrar unrar exe
  • C/C++中二维数组和指针关系分析

    在C c 43 43 中 xff0c 数组和指针有着密切的关系 xff0c 有很多地方说数组就是指针式错误的一种说法 这两者是不同的数据结构 其实 xff0c 在C c 43 43 中没有所谓的二维数组 xff0c 书面表达就是数组的数组
  • 四叉树空间索引原理及其实现

    今天依然在放假中 xff0c 在此将以前在学校写的四叉树的东西拿出来和大家分享 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构 它将已知范围的空间等分成四个相等的子空间 xff0c 如此递归下去 xff0c 直至树的层次达到一定
  • DirectXShaderCompiler mac编译

    Directxshader compiler mac编译 1 前置条件 Please make sure you have the following resources before building GitPython Version
  • intel -tbb 源码cmake构建

    cmake minimum required VERSION 3 0 0 FATAL ERROR set CMAKE CXX STANDARD 17 project tbb CXX add library tbb SHARED void c
  • iOS编译openmp

    1 下载openmp源码 https github com llvm llvm project releases download llvmorg 14 0 6 openmp 14 0 6 src tar xz 2 下载ios toolch
  • mysql存储过程及拼接字符串的用法

    DROP PROCEDURE IF EXISTS insert historytable DELIMITER CREATE PROCEDURE insert historytable BEGIN 定义判断变量 DECLARE 1 id va
  • 矩阵的特征值和特征向量的雅克比算法C/C++实现

    矩阵的特征值和特征向量是线性代数以及矩阵论中非常重要的一个概念 在遥感领域也是经常用到 xff0c 比如多光谱以及高光谱图像的主成分分析要求解波段间协方差矩阵或者相关系数矩阵的特征值和特征向量 根据普通线性代数中的概念 xff0c 特征值和
  • windows多线程详解

    在一个牛人的博客上看到了这篇文章 xff0c 所以就转过来了 xff0c 地址是http blog csdn net morewindows article details 7421759 本文将带领你与多线程作第一次亲密接触 xff0c

随机推荐