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 <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] 8、 开始编译,理所当然不会那么顺利的,跑一阵子出现问题:

跟开始mysql一样,路径问题,到树莓派里面跑同样的命令

拿到结果直接到  /qt-everywhere-src-5.14.2/qtwebengine/src/3rdparty/chromium/build/config/linux 目录里面 gedit ./pkg_config.py

修改返回结果即可 sysroot 路径补齐,然后继续 make

【后面类似思路,一步步解决,最终成功······可惜没空截图了.... 】

 

posted @ 2020-06-23 15:50  zhaoker  阅读(842)  评论(0编辑  收藏  举报