20200628-01 树莓派4B 交叉编译 Qt5.14.2 基于 ubuntu18.04 & ubuntu20.0

2023-05-16

修改日志

20210813 增加部分内容
1 rpi-update 本地更新的方式
2 tests.pkg-config fail 错误的处理
3 增加 GL 驱动开启的说明

前言

执行流程包含树莓派上的操作,以及 PC 机上的操作,可以通过后缀[pi] 或 [pc] 来区分,整个教程参考这些文章和视频如有需求可自行前往

Qt 官方教程文档
Qt For X11 要求
他人教程文档
他人完整教程视频

正式流程

1) 安装 树莓派 4B 系统

直接去官网下载,这是我选用的版本
在这里插入图片描述

window 下可以用这个作为烧写器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-063TfvDT-1593330857905)(en-resource://database/22277:1)]

2) 树莓派安装库

树莓派从 4B 版本开始于前面几个版面使用的显示插件略微有些许不同,这个会在后续步骤支出

2.1 连接 树莓派

默认用户名 pi 密码 raspberry

  • 方式一:直接通过 MCRIO HDMI 转出来到显示器上
  • 方式二:在 SD 卡上新建 一个文件名是 SSH 文件(无尾缀)就能通过其它工具登陆

之后可以通过 VNC 直接显示

1 sudo passwd root 设置密码
2 sudo passwd --unlock root 解锁 root 用户
3 sudo raspi-config
4 如图,启动 VNC 和 SSH,推荐直接用 SSH 登陆即可,方便操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuS5Loqb-1593330857910)(en-resource://database/22287:1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IdAgvYF-1593330857916)(en-resource://database/22285:1)]
启动 GL 驱动

选择Advanced Options —— GL Driver —— GL ( fake KMS ) —— OK (启动 GL 驱动 )

5 输入 IP 然后根据提示登陆即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X5jCrf2Z-1593330857922)(en-resource://database/22289:1)]

2.2 更新系统镜像源

这里使用的是国内清华大学的资源,这里需要说明一个细节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiZnR3yc-1593330857925)(en-resource://database/22283:1)]

如图所示,镜像版本是 buster 则就要使用尾缀是 buster 的镜像库

# 将原先文件内的库路径给注释掉,用下面的内容替换
# 1 软件源
# 路径:sudo vi /etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi

# 2 内核源
# 路径: sudo nano /etc/apt/sources.list.d/raspi.list
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui 
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

# 3 更新源
sudo apt-get update 
sudo apt-get upgrade 
2.3 更新固件

指令sudo rpi-update
若出现如下提示,说明跟新失败

!!! Failed to download update for rpi-update!
!!! Make sure you have ca-certificates installed and that the time is set correctly

具体说明可以参考这篇

这是因为 rpi-update 会自动更新自己,但国内因为某些原因通常没法成功,所以跳过这一步直接执行内核更新

手动执行固件更新进行如下步骤
注意:执行之前必须执行 upgrade 更新指令
1 sudo apt-get install ca-certifacates 安装 CA 证书
2 sudo apt-get install ntpdate 安装时间更新包
3 sudo ntpdate -u ntp.ubuntu.com 同步时间
4 sudo UPDATE_SELF=0 rpi-update 手动更新固件

终极本地更新

  1. curl -L https://github.com/Hexxeh/rpi-firmware/archive/master.tar.gz -o master.tar.gz
  2. 切换到root用户(第一次切到root记得用sudo passwd root激活) su
  3. 进入.rpi-firmware目录并解压(如果没有该目录,就创建一个)
    mkdir /root/.rpi-firmware
    cd /root/.rpi-firmware && tar -xvzf /root/master.tar.gz
  4. 这一步是我自己加的,可能是遇到了特殊情况。检查一下当前目录中是否有*.elf文件,如果没有,就说明那些文件,在当前目录下的一个叫rpi-firmware-master的子目录下, 把里面的文件全拷贝到当前目录中(/root/.rpi-firmware)
    cp ./rpi-firmware-master/* ./
  5. 执行本地更新 UPDATE_SELF=0 SKIP_DOWNLOAD=1 rpi-update
  6. reboot

注意:若是提示 github API limit 让你之后再试,这种可能需要某种手段尝试一下了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y6im8at9-1593330857927)(en-resource://database/22291:1)]

更新完成之后检查
cd /opt/vc/lib
如果有 libEGL.so 和 libGLESv2.so 说明更新成功,直接重启
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQKbBsLg-1593330857930)(en-resource://database/22293:1)]

具体可以查看/opt/vc/lib目录下的内容,更新前是没有libEGL.so和libGLESv2.so的,只有libbrcmEGL.so和libbrcmGLESv2.so,brcm的意思是博通,而我们前面说了博通的驱动是以前的树莓派用的

2.4 安装必要的库
# 中文
sudo apt-get install fonts-wqy-zenhei
# 其它库
sudo apt-get install "^libxcb.*"

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 libdouble-conversion-dev libpcre2-16-0 libpcre2-dev

# 检查是否开启 opengl
raspi-config
    Advanced Option
        GL Driver
# APT
  apt-get install mesa-utils
  apt-get update
  apt-get dist-upgrade
  
 # 问题 
 #Feature 'pkg-config' was enabled, but the pre-condition 'tests.pkg-config' failed.
# 在树莓派安装 
sudo apt-get install pkg-config
sudo apt-get install pkgconf
2.5 创建文件夹

cd /usr/local
sudo mkdir qt5pi
sudo chown pi:pi qt5pi


PC 端操作

1 同步库

先建一个文件夹 Linux

1 sudo mkdir /opt/qt5pi
2 sudo chown xx:xx qt5pi // xx 代指你 PC 的用户名
3 mkdir sysroot

rsync -avz pi@192.168.0.36:/lib sysroot
rsync -avz pi@192.168.0.36:/usr/include sysroot/usr
rsync -avz pi@192.168.0.36:/usr/lib sysroot/usr
rsync -avz pi@192.168.0.36:/opt/vc sysroot/opt
2 修改 opengl 的链接
#目的:启用 硬件 OPENGL 默认是通过软件模拟的
mv sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0 sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0_backup
mv sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0 sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0_backup
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/usr/lib/arm-linux-gnueabihf/libEGL.so.1.1.0
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.1.0
ln -s sysroot/opt/vc/lib/libEGL.so sysroot/opt/vc/lib/libEGL.so.1
ln -s sysroot/opt/vc/lib/libGLESv2.so sysroot/opt/vc/lib/libGLESv2.so.2
3 配置相对路径

在 /opt/qt5pi 目录下执行

./sysroot-relativelinks.py sysroot

获取 sysroot-relativelinks.py

#现在文档里很多都通过这个方式获取 sysroot-relativelinks.py 文件
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py

#本人没有成功,所以我是在 github 检索 sysroot-relativelinks 手动下载
https://github.com/trandinhchuong/sysroot-relativelinks 
这个路径在我写下这个配置文档时依旧可用,如果不可用,请直接自己创建文件

这个 sysroot-relativelinks.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)

4 下载 Qt 库

自行前往下载 Qt5.14.2 版本,并解压

cd qt-everywhere-src-5.14.2/qtbase/mkspecs/devices/

你就能看到

其中,进入到 linux-rasp-pi4-v3d-g++,打开 qmake.conf 就可以看到内容输出

# ./configure -release -opengl es2 -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/rpi/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \
#   -sysroot ~/rpi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/rpi/qt5 -v
#
# Check the configure output carefully. EGLFS, EGLFS GBM, and EGL on X11
# should all be 'yes'. Otherwise something is wrong.

这里就是官方推荐最基础的编译条件,我们需要下载一个交叉编译器
5 下载交叉编译器

linaro 下载链接
在这里插入图片描述
找个地方解压即可

6 配置 Qt 编译

这是我的编译条件

#!/bin/sh
./configure \
-release \
-opengl es2 \
-device linux-rasp-pi4-v3d-g++ \
-device-option \
CROSS_COMPILE=/home/xx/workspace/02_crosstool/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- \
-sysroot /opt/qt5pi/sysroot \
-opensource \
-confirm-license \
-qt-xcb \
-make libs \
-pkg-config \
-prefix /usr/local/qt5pi \
-nomake examples			\
-nomake tests				\
-nomake tools				\
-skip qt3d				\
-skip qtquick3d				\
-skip qtactiveqt			\
-skip qtcanvas3d			\
-skip qtconnectivity			\
-skip qtdatavis3d			\
-skip qtdoc				\
-skip qtgamepad				\
-skip qtlocation			\
-skip qtpurchasing			\
-skip qtsensors				\
-skip qtspeech				\
-skip qttools				\
-skip qtwayland				\
-skip webchannel			\
-skip qtwebengine			\
-skip qtwebglplugin			\
-skip qtwebsockets			\
-skip qtwebview				\
-skip qtmacextras 			\
-skip qtwinextras 			\
-no-use-gold-linker			\
-v 

-qt-xcb 是为了相较于 xcb 能够减少对于系统库的依赖
-skip 是不需要的库
其中 qtwayland 可以去掉没有必要
-no-use-gold-linker 和 -v 是官方推荐加上


./build_qt.sh
这个是自己写的执行脚本

编译完成之后请检查,输出

EGL on X11 , EGLFS GBM , EGLFS 三个都是 yes
基本如图所示,配置算是完成完成了
执行 make -j8
执行 make install
到这里交叉编译完成

在这里插入图片描述

如果提示失败,最好选择删掉整个文件夹,然后重新解压一个再试试看
如果失败,应该大概率是 /opt/qt5pi/sysroot 下的库缺失,可以试试这个配置

sudo apt-get build-dep qt5-qmake

sudo apt-get install libegl1-mesa-dev libgbm-dev libgles2-mesa-dev mesa-common-dev

sudo apt-get install libasound2-dev libpulse-dev gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-alsa

sudo apt-get install libvpx-dev libsrtp0-dev libsnappy-dev libnss3-dev

sudo apt-get install libfreetype6-dev libicu-dev libsqlite3-dev libxslt1-dev libavcodec-dev libavformat-dev libswscale-dev

sudo apt-get install libgstreamer0.10-dev gstreamer-tools libraspberrypi-dev libx11-dev

sudo apt-get install freetds-dev libsqlite0-dev libpq-dev libiodbc2-dev firebird-dev libjpeg9-dev libgst-dev libxext-dev libxcb1 libxcb1-dev libx11-xcb1

sudo 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

sudo apt-get install libxcb-glx0-dev libxi-dev libdrm-dev libxcb-xinerama0 libxcb-xinerama0-dev

sudo apt-get install libatspi-dev libxcursor-dev libxcomposite-dev libxdamage-dev

sudo apt-get install libxss-dev libxtst-dev libpci-dev libcap-dev libxrandr-dev libdirectfb-dev libaudio-dev

sudo apt-get install libcups2-dev unixodbc-dev(该库是为了安装 sql.h) libmng-dev 
7 同步回树莓派

注意: 已经在 树莓派上 /usr/local 下创建 qt5pi
树莓派上创建
/usr/local/qt5pi
sudo chown -R pi:pi qt5pi

执行这句指令:
rsync -avz sysroot/usr/local/qt5pi pi@192.168.0.36:/usr/local


总结

到此,全部配置编译都已经完成了,可以进行交叉编译了,这部分不再详细说明

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

20200628-01 树莓派4B 交叉编译 Qt5.14.2 基于 ubuntu18.04 & ubuntu20.0 的相关文章

随机推荐

  • linux系统开机自动挂载分区

    以挂载分区 dev sdb1为例 1 查看所有的分区 xff1a sudo fdisk l 1 修改分区类型 fdisk dev sdb 输入m可以查看帮助 xff0c 修改分区类型需要使用t命令 xff0c 并输入分区类型标号 2 查看分
  • Python文件处理相关函数

    文件 xff0c 文件夹 xff0c 压缩包处理模块模块 shutil模块 引入 xff1a import shutil shutil是对OS中文件操作的补充 xff1a 移动 复制 打包 压缩 解压 1 copy文件内容到另一个文件 xf
  • Python多线程

    线程的创建 加入 锁 待补充完善
  • noVNC压缩包下载

    1 浏览器器输入地址 Git地址 xff1a GitHub Where the world builds software GitHub https github com 2 搜索noVNC 3 选择novnc noVNC 4 点击发行版本
  • Python数据类型(结构)

    Python复合数据类型之一 列表 即写在方括号之间 用逗号隔开的数值列表 列表内的数值不必全是相同的类型 list1 span class token operator 61 span span class token punctuati
  • Python条件循环控制语句

    Python 条件语句 通过一条或多条语句的执行结果 xff08 True或者False xff09 来决定执行的代码块 Python程序语言指定任何非0和非空 xff08 null xff09 值为true xff0c 0 或者 null
  • Python面向对象编程

    Python面向对象编程
  • Python基础

    span class token comment 这是单行注释 span span class token triple quoted string string 39 39 39 多行注释 多行注释 39 39 39 span span
  • Python运算符

    Python 运算符 算术运算符 比运 关系 算符较 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 1 Python算术运算符 下假设变量 xff1a a 61 10 xff0c b 61 20 43 加 两个对象相加 a 43
  • Ubuntu环境搭建(NFS、ftp、ssh)

    文章目录 1 安装FTP2 安装NFS服务3 安装SSH 1 安装FTP 在开发的过程中会频繁的在 Windows 和 Ubuntu 下进行文件传输 xff0c 比如在 Windwos 下进行 代码编写 xff0c 然后将编写好的代码拿到
  • boa服务器之boa.conf文件的基本配置详解

    1 Port span class hljs number 80 span 2 User root span class hljs keyword 3 Group span root 4 ErrorLog dev console 5 Acc
  • 【文献阅读】VQA入门——Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge

    本人在读研一 xff0c 想要学习多模态这一块的工作 我在这里记录下我看的第一篇论文 Tips and Tricks for Visual Question Answering Learnings from the 2017 Challen
  • 若依分离版集成CAS单点登录-完整版

    前面用三篇文章介绍了若依前后端分离版集成CAS xff0c 实现单点登录功能 xff0c 同时对功能做了一点优化 xff0c 一是实现了单点登录成功后重定向页面为用户访问页面 xff1b 二是解决了单点登出缺陷 xff0c 三是介绍了解决跨
  • 无外接环境下,单笔记本直连浪潮服务器BMC灌装系统

    1 环境因素 xff1a 单服务器无网络无显示器等外接 xff0c 需要对浪潮防火墙灌装系统 xff1b 2 所需材料 xff1a 1 浪潮服务器 2 可接网线笔记本电脑 xff08 Windows平台 xff09 3 网线一根 3 连接拓
  • MySQL5.7免安装版安装操作

    一 下载地址 xff1a MySQL Begin Your Download http dev mysql com downloads file id 61 467269 下载到本地某一路径下 xff0c 下面开始安装 二 安装过程 1 创
  • Parseval’s theorem帕萨瓦尔定理及其证明过程

    Parseval 定理是信号视频分析 xff0c 相关推导过程汇总最常用的定理之一 xff0c 我们较为常用的表述是 xff0c 信号在时域和频域上的功率相等 xff0c 现在找到一个较为详细的帕萨瓦尔定理的原始版本及其证明过程 xff0c
  • 外包or外派岗,可以去?

    大家好 xff0c 今天说说外包 外派岗位那些事 上一回 说到 xff0c Sheldon争取到大厂工作的机会 xff0c 其实是世界500强外资银行H xff0c 委托某上市人力外包公司C招的外派岗位 外包 外派的本质 在H银行的经理口中
  • 仓库 “http://ppa.launchpad.net/v-launchpad-jochen-sprickerhof-de/pcl/ubuntu focal Release” 没有 Release

    sudo add apt repository ppa v launchpad jochen sprickerhof de pcl报错仓库 http ppa launchpad net v launchpad jochen spricker
  • VNCViewer 灰屏白屏 没有按钮没有桌面 非root,实验室环境

    背景 实验室有很多的账户 xff0c 我不是root用户 我想开一个vnc远程 我依次执行下面的代码 vncserver cmd打印的结果会包括有一个你对应的序号 xff0c 也就是你是第几个申请使用vncserver的 例如我是10 接着
  • 20200628-01 树莓派4B 交叉编译 Qt5.14.2 基于 ubuntu18.04 & ubuntu20.0

    修改日志 20210813 增加部分内容 1 rpi update 本地更新的方式 2 tests pkg config fail 错误的处理 3 增加 GL 驱动开启的说明 前言 执行流程包含树莓派上的操作 xff0c 以及 PC 机上的