• 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

    【后面类似思路,一步步解决,最终成功······可惜没空截图了.... 】
  • 相关阅读:
    免费的数据库建模工具
    [原创]程序设计 异常处理总结
    C#混淆器 xenocode 使用说明
    [转载]Quartz.net官方开发指南 第九课: JobStore
    [转载] Quartz Cron 表达式(时间格式的写法)
    calico+macvlan
    华为欧拉openEuler 更新源没有main路径
    Difference between "genmask" and "netmask"?
    left join、right join和join的区别
    SQL查询时根据类型条件转换
  • 原文地址:https://www.cnblogs.com/zhaoker/p/13180382.html
Copyright © 2020-2023  润新知