• 基于全志H3的QT5.12.9移植教程


    一. 前言

    大学玩了很久的STM32单片机,STM32的MCU大多数是基于Arm Cortex-M3/M4/M7架构的芯片,具有极强的实时处理能力,但MCU相比于MPU而言还是有局限性。相比于MCU,MPU具有更高的处理和运算能力,一般需要运行较大型的操作系统(如:Linux、Andriod)来实现复杂的任务处理,这就决定了MPU应该具备更高的主频和更强大的算力,主要代表:Arm Cortex-A架构的处理器。

    为了完成在嵌入式上的进阶,在某宝买到了一块Liunx开发板,处理器为基于ARM Cortex-A7架构的全志H3。项目需要在开发板上运行QT应用,但是商家提供的最小系统中没有QT的运行环境,需要自己移植。

    二. 下载链接

    开发环境  :Ubuntu 18.04
    开发板系统 :精简版Linux3.4
    Qt源码  :qt-everywhere-src-5.12.9
    Qt Creater:qt-opensource-linux-x64-5.12.9.run
    交叉编译器 :gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-guneabi.tar.xz

    其中Qt源码和交叉编译器如果不想直接在官网翻,也可以直接在CSDN下载:

    三. 系统编译

    更新编译器

    Linux系统源码由商家提供,首先解压H3-DVK-lichee-201809.tar到Ubuntu系统中,Linux源码中的默认交叉编译器版本太低,需要替换成4.9.4版本的交叉编译器。将解压好的交叉编译器替换掉源码中lichee/brandy/gcc-linaro的文件夹。

    源码编译

    首次编译,需要导入默认的内核配置,进入linux3.4文件夹。执行:

    cp H3_defconfig .config
    
    • 1

    退回到lichee文件夹,再执行:

    ./build.sh config
    #依次选择 1 1 0 2
    #如果提示usbwifi 选择 y
    
    • 1
    • 2
    • 3

    仅首次编译需要 config,以后再次编译只需使用命令

    ./build.sh 
    
    • 1

    编译成功后,打包固件:

    ./build.sh pack
    # 固件位置:tools/pack/sun8iw7p1_dragonboard_dolphin.img
    
    • 1
    • 2

    四. QT源码编译

    添加编译器路径

    解压Qt源码到Ubuntu系统,修改文件内容:
    路径:qt-everywhere-src-5.12.9/qtbase/linux-arm-gnueabi-g++/qmake.conf
    目的:主要是为了指定编译Qt源码的编译器路径,这里选择刚刚复制到lichee源码中的编译器。

    #
    # qmake configuration for building with arm-linux-gnueabi-g++
    #
    
    MAKEFILE_GENERATOR      = UNIX
    CONFIG                 += incremental
    QMAKE_INCREMENTAL_STYLE = sublib
    
    include(../common/linux.conf)
    include(../common/gcc-base-unix.conf)
    include(../common/g++-unix.conf)
    
    # modifications to g++.conf
    QMAKE_CC                = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-gcc
    QMAKE_CXX               = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-g++
    QMAKE_LINK              = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-g++
    QMAKE_LINK_SHLIB        = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-g++
    
    # modifications to linux.conf
    QMAKE_AR                = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-ar cqs
    QMAKE_OBJCOPY           = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-objcopy
    QMAKE_NM                = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-nm -P
    QMAKE_STRIP             = /home/dell/linux_H3/lichee/brandy/gcc-linaro/bin/arm-linux-gnueabi-strip
    load(qt_config)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    配置、编译、安装

    进入qt-everywhere-src-5.12.9目录创建config.sh配置脚本,内容为:

    ./configure \
     -prefix /home/dell/qt_install \
     -xplatform linux-arm-gnueabi-g++ \
     -confirm-license \
     -opensource \
     -release \
     -shared \
     -qt-zlib \
     -qt-freetype \
     -sql-sqlite \
     -qt-libjpeg \
     -no-qml-debug \
     -no-dbus \
     -no-gif \
     -no-iconv \
     -no-opengl \
     -no-cups \
     -no-glib \
     -no-rpath \
     -no-avx \
     -no-openssl \
     -nomake tools \
     -qt-libpng \
     -no-tslib \
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    其中,-prefix /home/dell/qt_install为指定的Qt库安装路径,-xplatform linux-arm-gnueabi-g++为指定编译器,其余选项可以根据自己的需求来增减Qt组件,适当剪裁。

    修改执行权限

    chmod 777 config,sh
    
    • 1

    执行配置

    ./config.sh
    
    • 1

    编译源码

    make -j16
    
    • 1

    安装Qt

    make install
    
    • 1

    安装完成后,编译得到的Qt库就在/home/dell/qt_install中。

    五. QT移植与环境变量添加

    将上一步编译得到的Qt库,即/home/dell/qt_install,整个文件夹复制到lichee/buildroot/target/dragonboard/rootfs/opt/中。


    修改lichee/buildroot/target/dragonboard/extra/profile ,添加全局变量:

    export LD_LIBRARY_PATH=/opt/qt_install/lib
    export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/qt_install/plugins
    export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
    
    • 1
    • 2
    • 3

    修改完成后重新编译linux,打包系统。

    ./build.sh 
    ./build.sh pack
    
    • 1
    • 2

    六. 升级GLIBC

    将上一步打包得到的固件烧录进开发板,使用Xshell串口连接开发板打开终端,进入opt/qt_install/example目录,随便打开一个Qt示例,执行对应文件夹下的可执行文件。
    请添加图片描述
    Qt执行报错,这是由于我们更换了更高版本的交叉编译器,系统源码里原本的C/C++库就不支持了。

    可以在对应文件夹下执行如下命令查看对应版本号:

    strings libstdc++.so.6 | grep CXXABI   # 在/usr/lib中执行,查看CXXABI版本号
    strings libc.so.6 | grep GLIBC         # 在/lib中执行,查看GLIBC版本号
    
    • 1
    • 2

    我们需要将新的编译器中对应的库文件移植进系统中。对应库文件在gcc-linaro/arm-linux-gnueabi/libc下。

    这里粗暴得将该目录下的文件全部复制到lichee/buildroot/target/dragonboard/rootfs/lib/以及lichee/buildroot/target/dragonboard/rootfs/usr/lib/中,覆盖同名的库。

    七. 运行QT程序

    成功升级库后,再次跑Qt案例中的可执行文件,成功跑通,至此Qt.5.12.9移植成功。

    八. 参考资料

    1. 全志H3系统开发,移植Linux系统+Qt5.9.5
    2. 如何在全志H3硬件平台上面运行Qt
    3. Ubuntu14.04(64位)交叉编译环境搭建
    4. Ubuntu搭建 ARM平台QT环境
    5. ARM-GCC和开发板的HelloWorld
  • 相关阅读:
    没想到还有这种骚操作~如何使用Golang实现无头浏览器截图?
    「设计模式」抽象工厂模式
    基于单片机(STM32F103ZE)的智能家居集成控制器设计
    LeetCode算法二叉树—222. 完全二叉树的节点个数
    AWS亚马逊云注册图文详细教程,多币种充值优势分析
    MATLAB if...else...end 语句
    uni-combox实现是否禁止输入及点击需要两次才会展示搜索内容:
    【毕业季_进击的技术er】送别过去两年迷茫的自己。重整旗鼓,大三我来啦
    HTML5新特性 day_04(8.10)地图、文件上传
    Redis设计与实现
  • 原文地址:https://blog.csdn.net/weixin_44793491/article/details/125418053