Ubuntu20.04 交叉编译QT5.14.2 树莓派4 64bit (含eglfs,WebEngine,mysql)
【这是一篇写于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] 5、下载工具:https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/ 注意是 aarch64
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 relativelinks.py sync.sh 三者一起,第一次运行需要同步一阵子
[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 开启后若不通过会提示,而且目前是不会过的,这个问题issus上很多提出来,目前我的办法是,手工在树莓派上运行 ,mysql_config 得到的结果保存后,
写个小代码来告诉编译器,主要是 --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#include 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] 8、 开始编译,理所当然不会那么顺利的,跑一阵子出现问题:
跟开始mysql一样,路径问题,到树莓派里面跑同样的命令
拿到结果直接到 /qt-everywhere-src-5.14.2/qtwebengine/src/3rdparty/chromium/build/config/linux 目录里面 gedit ./pkg_config.py
修改返回结果即可 sysroot 路径补齐,然后继续 make
【后面类似思路,一步步解决,最终成功······可惜没空截图了.... 】