【这是一篇写于2020年6月文章,可惜当时忙就没发,一眨眼两年了,后面有些步骤缺失,现在环境变了无法复原,真是遗憾】
有一篇知乎作者写的文章非常详实,链接查看 是对官方文档的说明文档的很好的补充,此文在此基础上进行深入操作(其实开始搞的时候没有看,后来又问题才发现的)
对方是在32位系统下的,这边64位有点区别,同时这边加上了 WebEngine (含ffmpeg插件) 和 mysql 插件安装说明。
大体步骤一致,重点讲一些网上很少涉及的地方。
[Pi] 1、系统升级到最新的,64位中 opt/vc 也没有了,系统之前已经编译成功了qt5.13.2 (具体看之前的文章)相关依赖安装上,我这里系统本身缺的东西不多,这边强烈建议,在PC交叉编译之前,把源码在树莓派设备上configure ,缺的依赖补充好,没问题再到PC上折腾会节省很多时间,configure一次测试速度还是可以的,不用make。
[Pi] 2、测试WebEngine
看看生成的报告里面缺什么
WebEngine Build Tools:
Use System Ninja ....................... no
Use System Gn .......................... no
Jumbo Build Merge Limit ................ 8
Developer build ........................ no
QtWebEngine required system libraries:
fontconfig ........................... yes
dbus ................................. yes
nss .................................. yes
khr .................................. yes
glibc ................................ yes
QtWebEngine required system libraries for qpa-xcb:
x11 .................................. yes
libdrm ............................... no
xcomposite ........................... yes
xcursor .............................. yes
xi ................................... yes
xtst ................................. yes
Optional system libraries used:
re2 .................................. no
icu .................................. no
libwebp, libwebpmux and libwebpdemux . no
opus ................................. no
ffmpeg ............................... no
libvpx ............................... no
snappy ............................... no
glib ................................. yes
zlib ................................. yes
.........
把缺失补上 qpa-xcb ninja 这两个补上:
apt install ninja-build libdrm-dev
这时候如果想要添加libwebp ffmpeg opus 等支持还需要运行:
apt install libavdevice-dev libavcodec-dev libopus-dev libwebp-dev
同时configure 还需要 加上 -webengine-ffmpeg 参数:
[Pi] 3、安装mysql支持:
apt install libmariadbd-dev libmariadb-dev libmariadb-dev-compat libmariadb-dev
这些搞完基本上七七八八的问题就没有了
[Pi] 4、补充些其他的,具体开启GL driver 、渲染组等不多说,参考知乎文章:
sudo apt-get install gdbserver
gdb远程调试要用,同时要建立密钥登陆手段,方便后期同步,可以密钥和密码同时使用,个人习惯
可以参考这篇文章,SSH密钥登陆
/etc/ssh/sshd_config 参数
也要密码登陆的话 #PasswordAuthentication yes 不用动,重启服务
systemctl restart sshd.service
[PC]
gcc 和 runtime 解压到一起合并,sysroot 解压到合适的地方,然后配置环境变量,确保sudo 和普通用户运行编译工具正常
[PC] 6、同步树莓派的重要文件夹以及通过脚本(已下载改名为relativelinks.py)修改软链接,我这边写个脚本(sync.sh)方便自己:
#/bin/sh
echo "begin sync document and fix link...."
rsync -e "ssh -i /home/zzx/keys/raspi4_key/root_key" -avz root@XX.XX.X.X:/lib sysroot
rsync -e "ssh -i /home/zzx/keys/raspi4_key/root_key" -avz root@XX.XX.X.X:/usr/include sysroot/usr
rsync -e "ssh -i /home/zzx/keys/raspi4_key/root_key" -avz root@XX.XX.X.X:/usr/lib sysroot/usr
rsync -e "ssh -i /home/zzx/keys/raspi4_key/root_key" -avz root@XX.XX.X.X:/usr/local sysroot/usr
#rsync -e "ssh -i /home/zzx/keys/raspi4_key/root_key" -avz root@XX.XX.X.X:/usr/share sysroot/usr
/home/zzx/raspi/relativelinks.py sysroot
echo "Mission complete...."
注意 /usr/share 也要同步,root_key 就是之前树莓派上创建的私钥拷贝来的权限设置好,脚本放在 /home/zzx/raspi/
sysroot
[PC] 7、解压下载好的5.14的源码,方便构建,搞了个脚本:
#/bin/sh
./configure -device linux-rasp-pi4-64bit-v3d-g++ \
-device-option CROSS_COMPILE=/home/zzx/raspi/cross-tools/bin/aarch64-linux-gnu- \
-prefix /opt/Qt5.14.2 \
-extprefix /home/zzx/raspi/Qt5.14.2 \
-hostprefix /home/zzx/raspi/Qt5.14.2-host \
-sysroot /home/zzx/raspi/sysroot \
-opensource -confirm-license \
-reduce-exports \
-opengl es2 -eglfs \
-make libs \
-qt-pcre \
-ssl -tslib -ico -sqlite -system-freetype -fontconfig -glib \
-webengine-ffmpeg -sql-mysql \
-mysql_config /home/zzx/raspi/mysql_config \
-recheck-all -release -v
注意要点:-webengine-ffmpeg 要手工开启,-sql-mysql
写个小代码来告诉编译器,主要是 --version --libs_r --includes 三个参数,然后加上Ubuntu里面实际的sysroot 路径即可
具体代码如下【python】,写完了用pyinstaller 转换成可执行文件,pip3 install pyinstaller 然后 pyinstaller mysql_config.py -F 改个名字就可以:
# /usr/bin/python3
import sys
sysroot = "/home/zzx/raspi/sysroot"
LIBS = "-L%s/usr/lib/aarch64-linux-gnu/ -lmariadb" % sysroot
INCLUDE = "-I%s/usr/include/mariadb -I%s/usr/include/mariadb/mysql" % (sysroot, sysroot)
show_case = {
"--version": "10.3.22",
"--libs": LIBS,
"--libs_r": LIBS,
"--include": INCLUDE,
}
if len(sys.argv) < 2:
print("Show nothing")
elif sys.argv[1] in show_case:
print(show_case[sys.argv[1]])
else:
print("Unknown arguments")
或者用C++写,这里感谢 黑月教主 的帮助:
#include <iostream>
#include <unordered_map>
using namespace std;
string sysroot = "/home/zzx/raspi/sysroot";
string LIBS = "-L" + sysroot + "/usr/lib/aarch64-linux-gnu/ -lmariadb";
string INCLUDE = "-I" + sysroot + "/usr/include/mariadb -I" + sysroot + "/usr/include/mariadb/mysql";
unordered_map<string, string> showcase = {
{"--version", "10.3.22"},
{"--libs", LIBS},
{"--libs_r", LIBS},
{"--include", INCLUDE},
};
int main(int argc,char *argv[]){
if (argc <2)
std::cout << "Show nothing" << endl;
else if (showcase.find(argv[1])!= showcase.end())
std::cout << showcase[argv[1]] << endl;
else
std::cout << "Unknown arguments" << endl;
}
g++ mysql_config.cpp -o mysql_config 保存在 /home/zzx/raspi/ 中
测试下效果:
接着PC上补充一下build工具:
apt install bison libclang-dev libclang-7-dev llvm-7 clang-7 ninja-build gperf bison flex libwayland-bin
sudo ln -s /usr/bin/llvm-config-7 /usr/bin/llvm-config
这样再configure一遍应该就完美了,想要的基本上都是 YES ,
注意如果之前树莓派不小心依赖测试时候装多了七七八八的,很可能 EGLFS details 里面 Raspberry pi 变成yes,一定要关闭这是旧驱动,否则编译不过的,
出现错误:【 ‘EGL_DISPMANX_WINDOW_T’在此作用域中尚未声明】
到raspi目录下搜下bcm_host文件位置,然后改个名就可以了,应该在这里的:
mv ./sysroot/usr/include/bcm_host.h ./sysroot/usr/include/bcm_host.h.bak
[PC]
跟开始mysql一样,路径问题,到树莓派里面跑同样的命令
拿到结果直接到 /qt-everywhere-src-5.14.2/qtwebengine/src/3rdparty/chromium/build/config/linux 目录里面 gedit ./pkg_config.py
修改返回结果即可 sysroot 路径补齐,然后继续 make
【后面类似思路,一步步解决,最终成功······可惜没空截图了.... 】