RK3358 Qt 交叉编译之二:编译 LinuxFB 版本

发布时间 2023-04-21 16:40:23作者: fengMisaka

下面介绍如何进行 RK3588 ARM Qt 开发环境搭建。开发环境:

  • 主机(虚拟机) : ubuntu 18.04 x86_64
  • 目标机(RK3588 ARM板,NVR 方案)
  • 交叉编译工具链:RK3588_NVR_SDK_SDK/build/toolchain.tar.gz
  • Qt 版本:Qt5.12.2,即qt-everywhere-src-5.12.2.tar.xz
  • Qt Creator 版本:4.8.2
  • 电脑远程软件:MobaXterm_Personal_22.0(SSH、SFTP)

SDK 下载可以参考该系列的前一篇博客:RK3358 Qt 交叉编译之一:SDK 下载

Ubuntu 下载可以参考:(11条消息) VM中安装Ubuntu18.04.4并进行显示界面的放大_ubuntu放大_JamalChou的博客-CSDN博客


前排提示:由于 RK3358 NVR 方案的内核不支持 Framebuffer 显示,没有 /dev/fb0,所以不支持 LinuxFB 平台插件。但当时这篇记录博客也写完了,就这么丢弃了也太可惜,干脆记录一下,方便自己以及以后交叉编译 RK3358 其它方案或其它芯片的同学参考。

下一篇博客会记录 eglfs_kms 的交叉编译过程。

一、安装 交叉编译工具链

下面在主机上安装交叉编译工具链,并设置好工具链路径。

(1)切换成 root 以后,以后也都以 root 权限执行命令。新建安装目录,并将 RK3588_NVR_SDK_SDK 目录下的交叉编译工具 toolchain.tar.gz 复制到安装目录,复制完成后进入安装目录下,解压到当前目录下:

$ su
$ password for book:******
$ mkdir -r /opt/qt5112_rk3588/toolchain
$ cp /RK3588_NVR_SDK/build/toolchain.tar.gz /opt/qt5112_rk3588/toolchain
$ cd /opt/qt5112_rk3588/toolchain
$ tar -xvf toolchain.tar.gz

ls 当前目录如下所示:

$ ls
10.3-2021.07-x86_64-aarch64-none-linux-gnu-manifest.txt  aarch64-none-linux-gnu  bin  include  lib  lib64  libexec  runtime_lib  share  toolchain.tar.gz

(2)将编译器路径加入系统环境变量:

$ vi /etc/profile

在末尾添加如下内容:

$ export PATH="/opt/qt5112_rk3588/toolchain/bin:$PATH"

接着输入命令:

$ source /etc/profile

让环境变量生效,也可以重启 Ubuntu 系统。


(3)测试是否安装成功,输入aarch64-none-linux-gnu-再按 tab 键 :

Qt_RK3588_C.png

若出现如上图所示情况,则证明交叉编译工具链安装成功了。

也可以查看编译器的版本号:

$ aarch64-none-linux-gnu-g++ -v
Using built-in specs.
COLLECT_GCC=aarch64-none-linux-gnu-g++
COLLECT_LTO_WRAPPER=/opt/qt5112_rk3588/toolchain/bin/../libexec/gcc/aarch64-none-linux-gnu/10.3.1/lto-wrapper
Target: aarch64-none-linux-gnu

输出如上所示,也可以证明安装成功。

二、交叉编译 Qt 源码

先下载 qt-everywhere-src-5.12.2.tar.xz,下载地址: Index of /archive/qt

下面正式开始交叉编译,这是最重要的一步,也是最费时,也是最容易出错的一步。

(1)先创建源码安装目录,然后通过 SSH 远程工具将下载的 qt-everywhere-opensource-src-5.9.1.tar.xz 压缩包从 Windows 系统复制到源码安装目录下,然后解压:

$ cd /opt/qt5112_rk3588
$ mkdir qtSource
$ tar -xvf qt-everywhere-src-5.12.2.tar.xz

解压完成后进入获得的文件夹下,ls 一下,可以看到如下文件:

Qt_RK3588_A.png


(2)接着输入命令:

$ vi qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf

可以看到原本的配置内容:

#
# qmake configuration for building with aarch64-linux-gnu-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                = aarch64-linux-gnu-gcc
QMAKE_CXX               = aarch64-linux-gnu-g++
QMAKE_LINK              = aarch64-linux-gnu-g++d
QMAKE_LINK_SHLIB        = aarch64-linux-gnu-g++

# modifications to linux.conf
QMAKE_AR                = aarch64-linux-gnu-ar cqs
QMAKE_OBJCOPY           = aarch64-linux-gnu-objcopy
QMAKE_NM                = aarch64-linux-gnu-nm -P
QMAKE_STRIP             = aarch64-linux-gnu-strip
load(qt_config)

qmake.conf 在其中添加如下内容,并保存,如下图所示(rk3588 是 armv8 架构)

#
# qmake configuration for building with aarch64-linux-gnu-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv8-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv8-a -lts

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

# modifications to g++.conf
QMAKE_CC                = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-gcc
QMAKE_CXX               = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-g++
QMAKE_LINK              = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-g++
QMAKE_LINK_SHLIB        = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-g++

# modifications to linux.conf
QMAKE_AR                = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-ar cqs
QMAKE_OBJCOPY           = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-objcopy
QMAKE_NM                = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-nm -P
QMAKE_STRIP             = /opt/qt5112_rk3588/toolchain/bin/aarch64-none-linux-gnu-strip
load(qt_config)

重点是重新指向 QMAKE_CC 等编译器路径到 aarch64-none-linux-gnu,即对应的交叉编译工具链的绝对路径。


(3)保存后接着输入以下命令,新建一个自动配置脚本文件,仍在qt-everywhere-src-5.12.2目录下:

$ vi auto.sh

新建的auto.sh为交叉编译自动配置脚本,根据自己实际需求配置 Qt,在其中添加以下内容:

#!/bin/sh
./configure \
-prefix /opt/qt5112_rk3588/qt5122-arm-linuxfb \
-confirm-license \
-opensource \
-release \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-qt-libjpeg \
-qt-libpng \
-qt-zlib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-dbus \
-no-xcb \
-no-separate-debug-info \
-no-ssl \
-nomake tests \
-nomake examples \
-nomake tools \
-no-sql-sqlite \
-no-iconv \
-skip qt3d \
-skip qtactiveqt \
-skip qtcanvas3d \
-skip qtcharts \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdeclarative \
-skip qtgamepad \
-skip qtandroidextras \
-skip qtdoc \
-skip qtwebchannel \
-skip qtwebengine \
-skip qtwebglplugin \
-skip qtwebview \
-skip qtvirtualkeyboard \
-recheck
  • /opt/qt5112_rk3588/qt5122-arm为编译后的安装目录
  • -xplatform linux-aarch64-gnu-g++ 为 qmake.conf 所在的目录,还记得之前我们修改过/opt/qt5112_rk3588/qt-everywhere-src-5.12.2/qtbase/mkspecs/linux-aarch64-gnu-g++文件夹下的 qmake.conf 文件吧,前后是有对应的
  • -no-xcb要选择,要不然编译会出差,尝试了各种方法也没解决这个问题

接着修改该文件权限并执行:

$ chmod 777 auto.sh 
$ ./auto.sh

首次时间会比较长,结束后会显示如下图所示结果,可以看到 LinuxFB 这个 QPA 平台插件被勾选,表示成功配置了 LinuxFB:

QPA backends:
  DirectFB ............................... no
  EGLFS .................................. no
  EGLFS details:
    EGLFS OpenWFD ........................ no
    EGLFS i.Mx6 .......................... no
    EGLFS i.Mx6 Wayland .................. no
    EGLFS RCAR ........................... no
    EGLFS EGLDevice ...................... no
    EGLFS GBM ............................ no
    EGLFS VSP2 ........................... no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no
    EGLFS X11 ............................ no
  LinuxFB ................................ yes

一般只编译 LinuxFB,不编译 OpenGL 的话,./configure 这步一般不会报错,但是如果报错了,可以看看打印输出或者 config.log,解决完报错之后,重新 ./configure 前要执行rm -rf config.*清除缓存,然后再执行 ./configure。


(4)./configure成功之后,接着输入:

$ make

进行编译,大概需要一个小时,如果输出最后有这么一句话:make[2]: Nothing to be done for 'install'.,则表示 make 成功。否则就要看看 make 打印是哪里报错了,打印没看出的话, 就要打开 config.log 搜索 "错误" 或 "error" 查找错误所在位置了。解决完之后,重新执行 ./configure,然后再 make。

make 成功了,就输入以下命令进行编译安装:

$ make install

大约一分钟后,可以看见 /opt/qt5112_rk3588 目录下出现了我们指定的安装目录/opt/qt5112_rk3588/qt5122-arm,表示 ARM Qt 库安装成功,到此交叉编译就成功了。

Qt_RK3588_J.png


输入以下命令,还能看到安装的所有 Qt 库:

$ ls /opt/qt5112_rk3588/qt5122-arm/lib/

Qt_RK3588_K.png

三、安装 Qt Creator 并配置

先下载 qt-opensource-linux-x64-5.12.8.run,下载地址:Index of /archive/qt

(1)建立安装目录:

$ mkdir /usr/bin/Qt5.12.8

将下载的 qt-opensource-linux-x64-5.12.8.run 安装在 /opt 目录下,加上可执行权限后执行:

$ chmod 777 qt-opensource-linux-x64-5.12.8.run
$ ./qt-opensource-linux-x64-5.12.8.run

后面的步骤不再详细说明。具体请参考:Linux安装qt完整版教程


(2)安装完成后我们可以在下面的目录下看到 qtcreator,运行即可:

$ cd /opt/Qt5.12.8/Tools/QtCreator/bin
$ ls
$ ./qtercator

运行程序,然后点击工具下的选项,点击构建与运行,在编译器栏中的 manual 添加我们前面安装的交叉编译工具,包括 aarch64-none-linux-gnu-gcc 与 aarch64-none-linux-gnu-g++,如下图所示:

Qt_RK3588_N.png


Qt_RK3588_O.png


(3)接着点击 Qt versions 栏添加 qmake,目录为交叉编译后安装的 qt 目录,如下图所示:

Qt_RK3588_P.png


(4)最后在构建套件栏目添加套件,如下图所示,包括名称、设备类型、编译工具、Qt 版本等信息,如下图所示:

Qt_RK3588_Q.png

四、在主机上交叉编译示例

前面在 UBuntu 主机上安装好了 Qt Creator,然后就可以打开个示例程序交叉编译了。

例如 application 这示例拷贝到/opt/qt5112_rk3588/demo,然后用 Qt Creator 打开该工程,选择 ARM-RK3588 这个套件进行编译,编译出 Release 版本的可执行文件:application:

$ cp -rf /opt/Qt5.12.8/Examples/Qt-5.12.8/widgets/widgets/application /opt/qt5112_rk3588/demo

然后使用 scp 命令拷贝到 ARM 板子上的 /usr/bin 目录下:

$ scp /opt/qt5112_rk3588/demo/application/application root@192.168.13.189:/usr/bin

当然也可以直接使用 qmake 来交叉编译:

$ cd /opt/Qt5.12.8/Examples/Qt-5.12.8/widgets/widgets/application /opt/qt5112_rk3588/demo/application
$ qmake -j8
$ make

不报错的话,可以看到编译出了可执行文件:application。

五、将交叉编译的Qt库复制到板子上执行

(1)在 /opt 目录下输入命令:

$ tar -cvf qt5122-arm.tar.gz qt5122-arm

其中qt5122-arm.tar.gz为生成的压缩文件名称,qt5122-arm为交叉编译后安装的目录,通过 MobaXterm 将其复制到板子的 /opt 目录,解压,板子上输入的命令如下所示:

$ cd /opt
$ tar -xvf qt5122-arm.tar.gz

(2)接着将 qt 程序运行所依赖的相关文件、配置等添加到环境变量中,操作如下:

$ vi /etc/profile

在其中添加如下内容:

# Qt
export QTEDIR=/opt/qt5122-arm/
export LD_LIBRARY_PATH=/opt/qt5122-arm/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins

# LinuxFB
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FB_DRM=1

(3)然后执行./application报错:

Qt_RK3588_error.png


原因发现是 RK3358 没有 fb,所以不支持 LinuxFB 平台插件。

所以这篇博客到此为止中止了,暂时不继续往下解决了,这里只是记录下。下一篇博客会记录 eglfs_kms 的交叉编译过程。


参考:

(11条消息) RK3399 ARM QT开发环境搭建_rk3399 qt交叉编译环境搭建_风的呼吸7的博客-CSDN博客

(11条消息) Firefly AIO-3399ProC开发板与PC端部署Qt5.12.2交叉编译环境_firefly qt5 交叉编译_foreverey的博客-CSDN博客