执行流程包含树莓派上的操作,以及 PC 机上的操作,可以通过后缀[pi] 或 [pc] 来区分,整个教程参考这些文章和视频如有需求可自行前往
Qt 官方教程文档
Qt For X11 要求
他人教程文档
他人完整教程视频
window 下可以用这个作为烧写器
树莓派从 4B 版本开始于前面几个版面使用的显示插件略微有些许不同,这个会在后续步骤支出
默认用户名 pi 密码 raspberry
之后可以通过 VNC 直接显示
1 sudo passwd root 设置密码
2 sudo passwd --unlock root 解锁 root 用户
3 sudo raspi-config
4 如图,启动 VNC 和 SSH,推荐直接用 SSH 登陆即可,方便操作
5 输入 IP 然后根据提示登陆即可
这里使用的是国内清华大学的资源,这里需要说明一个细节
如图所示,镜像版本是 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
指令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 会自动更新自己,但国内因为某些原因通常没法成功,所以跳过这一步直接执行内核更新
手动执行固件更新进行如下步骤:
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 手动更新固件
更新完成之后检查
cd /opt/vc/lib
如果有 libEGL.so 和 libGLESv2.so 说明更新成功,直接重启
具体可以查看/opt/vc/lib目录下的内容,更新前是没有libEGL.so和libGLESv2.so的,只有libbrcmEGL.so和libbrcmGLESv2.so,brcm的意思是博通,而我们前面说了博通的驱动是以前的树莓派用的
# 中文
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
先建一个文件夹
1 sudo mkdir /opt/qt5pi
2 sudo chown pi:pi qt5pi
3 mkdir sysroot
同步操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgtZKiVo-1593330857933)(en-resource://database/22295:1)]
rsync -avz [email protected]:/lib sysroot
rsync -avz [email protected]:/usr/include sysroot/usr
rsync -avz [email protected]:/usr/lib sysroot/usr
rsync -avz [email protected]:/opt/vc sysroot/opt
#目的:启用 硬件 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
在 /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] + "" )
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)
自行前往下载 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.
这里就是官方推荐最基础的编译条件,我们需要下载一个交叉编译器
这是我的编译条件
./configure \
-release \
-opengl es2 \
-device linux-rasp-pi4-v3d-g++ \
-device-option \
CROSS_COMPILE=/home/xza/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 libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev
sudo apt-get install libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev 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 "^libxcb.*"
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 libglib2.0-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 libssl-dev libxcb-xinerama0 libxcb-xinerama0-dev
sudo apt-get install libatspi-dev libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libfontconfig1-dev
sudo apt-get install libxss-dev libxtst-dev libpci-dev libcap-dev libsrtp0-dev libxrandr-dev libnss3-dev libdirectfb-dev libaudio-dev
注意: 已经在 树莓派上 /usr/local 下创建 qt5pi
执行这句指令:
rsync -avz sysroot/usr/local/qt5pi [email protected]:/usr/local
到此,全部配置编译都已经完成了,可以进行交叉编译了,这部分不再详细说明