3. Qt程序编译

本章将讲解的内容:

  • 如何在鲁班猫板卡上直接编译并运行Qt程序;

  • 如何在ubuntu20.04上交叉编译Qt程序(Qt5/QT6)并在板卡上部署运行。

3.1. 鲁班猫上编译Qt程序

鲁班猫板卡上按照前面的教程安装Qt Creator和一系列工具后,我们接下来安装相关Qt库和Qt例程, 然后在板卡上编译并运行例程(以烧录Debian10系统的板卡为例)。

# 安装qt核心库
# Debian10是安装的是Qt5.11.3,ubuntu20.04安装Qt5.12.8, Debian11默认安装Qt5.15.2
sudo apt-get install qt5-default

# 或者是使用下面命令(如果是Debian11系统)
sudo apt-get install  qtbase5-dev qt5-qmake

# 安装一些Qt例程
sudo apt-get install qtbase5-examples

在桌面,找到图标 Qt Creator 然后点击 example 选项,选择analogclock例程(下面示例的是lubancat-2板卡,debian10系统)。

qt_cross_compiling003.png

如果Qt Creator中example没有显示如上图所示例程,可以点击 file, 然后选择打开工程所在的目录:

qt_cross_compiling003.png

到系统目录/usr/lib/aarch64-linux-gnu/qt5/examples下寻找相应的例程, analogclock例程在gui/analogclock目录下,点击选择analogclock.pro:

qt_cross_compiling003.png

注意:打开的/usr/lib/aarch64-linux-gnu/qt5/examples中的工程,默认配置时编译运行过程中生成文件需要root权限。为解决这问题,可以配置工程选择构建目录在用户目录下; 或者是将/usr/lib/aarch64-linux-gnu/qt5/examples复制到用户目录下 sudo cp -rf /usr/lib/aarch64-linux-gnu/qt5/examples ~/ ,然后打开。 或者使用root用户打开qtcreator,在桌面打开终端窗口使用命令运行 sudo qtcreator

然后选择编译套件,教程测试默认是 Desktop qt5.11.3,选择构建的目录等:

qt_cross_compiling003.png

点击Qt Creator左下角的编译运行符号,如果顺利会弹出一个时钟窗口:

qt_cross_compiling14.png

前面是使用Qt Creator编译,我们也可以使用命令行编译qt程序:

# 复制例程相关文件到用户目录下,修改安装路径等(注意文件的权限)
# 例程文件也可以从教程配套例程获取

# 切换到例程目录下,然后执行qmake命令
qmake analogclock.pro

# 自后使用make命令,编译生成可执行文件(默认release)
make

# 运行可执行程序
./analogclock

3.2. 虚拟机上交叉编译(Qt5)

在虚拟机上交叉编译Qt,需要在Qt Creator添加编译套件(kits),添加交叉编译需要的Qt库文件以及交叉编译器,下面我们将简单配置下环境。

3.2.1. 搭建交叉编译环境

为鲁班猫提供的交叉编译环境如下表,如果有其他环境需求请参考后面教程自行交叉编译QT库。

板卡系统

虚拟机系统

交叉编译工具链

Qt库版本

Ubuntu20.04

Ubuntu20.04

aarch64-linux-gnu 9.4.0

Qt 5.15.8

Debian10

Ubuntu20.04

aarch64-linux-gnu 8.3.0

Qt 5.15.8/Qt6.2.4

Debian11

Ubuntu20.04

aarch64-none-linux-gnu 10.2.0

Qt 5.15.8

下面将以 鲁班猫debian10系统 为例,配置下Qt Creator交叉编译套件(也可以直接使用命令交叉编译)。

提示

为鲁班猫其他系统交叉编译Qt程序也是一样,但是注意使用交叉编译器。例如ubuntu20.04系统,使用系统默认安装的交叉编译器, 其安装命令是 sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

1、获取相关文件

网盘 获取相关文件(文件会实时更新,以实际为准):

qt_cross_compiling17.png

复制网盘的文件(交叉编译器、Qt库文件、sysroot文件)到虚拟机系统中,然后解压到指定目录:

# 从网盘获取交叉编译器、Qt库文件、sysroot文件
# 复制文件到虚拟机系统中

# 解压文件交叉编译器,Qt文件,sysroot文件,解压到指定/opt目录下,必须是/opt目录
sudo tar -xf  gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C  /opt
sudo tar -xzf  qt-everywhere-src-5.15.8.tar.gz  -C /opt
sudo tar -xzf  sysroot_debian10.tar.gz -C  /opt

如果是为鲁班猫ubuntu20.04系统,则使用的交叉编译器是aarch64-linux-gnu-gcc 9.4.0,虚拟机中apt工具安装gcc-aarch64-linux-gnu和g++-aarch64-linux-gnu。

2、Qt Creator编译套件(kits)

虚拟机上打开Qt Creator,点击编译,然后打开 首选项 :

qt_cross_compiling17.png

点击构建套件,添加Qt Versions,随后设置名称,设置路径 /opt/qt-everywhere-src-5.15.8/host/bin/qmake :

qt_cross_compiling17.png

添加交叉编译器,添加C/C++交叉编译器,选择路径 /opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin :

qt_cross_compiling17.png

添加编译套件(名称为Lubancat_rk_debian10),选择前面添加的Qt 版本和交叉编译器,并设置sysroot路径 /opt/sysroot , 顺便为编译套件加一个鲁班猫的图标:

qt_cross_compiling17.png

3.2.2. 编译Qt程序

打开Qt Creator,选择一个自带Qt例程(示例是analogclock),然后设置工程的编译套件(Lubancat_rk_debian10),设置项目构建目录:

qt_cross_compiling17.png

点击编译:

qt_cross_compiling17.png

会在构建目录下生成可执行文件:

qt_cross_compiling17.png

3.2.3. 板卡上运行Qt程序

复制Qt库到板卡,然后设置相应的环境变量,就可以运行程序。 先复制前面编译的Qt程序到板卡,然后简单运行程序(鲁班猫debian10带桌面系统):

# 从网盘获取对应的Qt交叉编译库文件,并复制到板卡系统中,然后解压到/opt目录下
tar -xzf  qt-everywhere-src-5.15.8.tar.gz  /opt

# 设置环境变量,测试使用xcb插件
LD_LIBRARY_PATH=/opt/qt-everywhere-src-5.15.8/ext/lib ./analogclock -platform xcb

# 设置环境变量,并使用eglfs等等
LD_LIBRARY_PATH=/opt/qt-everywhere-src-5.15.8/ext/lib ./analogclock -platform eglfs
qt_cross_compiling12.png

提示

以上部署测试都是通过命令中设置运行环境变量,我们也可以添加到一个shell脚本中,然后运行或者系统配置中(直接添加环境变量到/etc/ld.so.conf,/etc/profile.d/xxx.sh)。

以上只是简单的测试,一些系统运行可能有问题,需要配置环境变量,请参考下后面 部署运行章节

另外,板卡使用插件显示时会显示失败导入插件,请导出环境变量 export QT_DEBUG_PLUGINS=1 查看具体的报错原因, 一般而言是缺少某些库,请使用下面命令安装,然后重新运行程序。

# xcb相关
sudo apt update
sudo apt install libx11-dev libx11-xcb-dev  libxkbcommon-dev libxkbcommon-x11-dev libxext-dev libxfixes-dev  libxcb-xinput0
sudo apt install libxcb-*

# 其他相关(板卡系统不同,可能有些库搜索不到,可以不安装)
sudo apt install libmtdev-dev libinput-dev libts-dev

3.3. 虚拟机上交叉编译(Qt6)

这小节将搭建一个交叉编译环境,为鲁班猫板卡编译Qt6程序,测试例程使用cmake,如果使用qmake构建工程参考前面小节。测试的环境是鲁班猫Debian10系统。

3.3.1. 获取配套开发文件

先在虚拟机安装下所需的工具:

# 安装cmake make bison ninja-build等工具,需要注意cmake版本需要在3.16以上
sudo apt update
sudo apt install cmake make bison ninja-build

测试使用Debian10系统,先进入 网盘 , 找到鲁班猫->1-野火开源图书_教程文档->Qt教程相关源文件->debian10->Qt6.2.4目录下:

qt_cross_compiling17.png

获取该目录下所有文件,复制到虚拟机的/opt目录下,一些文件需要解压,可以使用下面命令:

# 解压到系统目录/opt下
sudo tar -xf  gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C  /opt
sudo tar -xzf  lubancat_qt6_debian10.tar.gz -C  /opt
sudo tar -xzf  qt6-host.tar.gz  -C /opt

最后确认下虚拟机/opt目录下有这些文件:交叉编译器,交叉编译Qt6库,Qt6 host文件,sysroot文件和lubancat_qt6.cmake配置文件。

3.3.2. 添加编译套件(kits)

打开Qt Creator,点击 工具->配置... ,进入编译套件(kit)界面,然后点击 Qt 版本 ,手动添加:

qt_cross_compiling17.png

然后点击 编译器 , 添加前面从网盘获取的交叉编译器:

qt_cross_compiling17.png

如果使用qmake,需要添加远程部署设备,参考下后面 远程连接章节

前面配置了相关组件,接下来我们添加一个编译套件( lubancat_rk356x_debian10_qt6 ),用来搭建一个交叉编译环境,为鲁班猫板卡编译Qt程序。

qt_cross_compiling17.png

我们添加前面配置的交叉编译器,如果前面添加了远程部署设备,也可以添加到Kit。 然后配置使用系统的cmake(注意使用3.16版本以上),配置cmake generator使用makefile(也可以使用ninja等):

qt_cross_compiling17.png

并且要修改下cmake的配置,这里添加配置文件qt.toolchain.cmake路径和makefile路径:

-DCMAKE_TOOLCHAIN_FILE:FILEPATH=/opt/lubancat_qt6_debian10/lib/cmake/Qt6/qt.toolchain.cmake
-DCMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make

需要注意,我们后面测试使用cmake,Qt version选项没有配置前面添加的 Qt 版本 (默认选择无), 但是使用qmake时需要添加该选项,使用qmkae交叉编译Qt6参考下前面交叉编译Qt5。 最后点击 应用->确认 就完成了编译套件配置。

3.3.3. 测试cmake例程

点击Qt Creator,打开例程文件(参考配套例程或者qt源码):cube/CMakeLists.txt,然后选择前面配置的编译套件(lubancat_rk356x_debian10_qt6):

qt_cross_compiling17.png

最后显示的工程文件:

qt_cross_compiling17.png

点击编译,就会在默认的构建目录文件夹build-cube-lubancat_rk356x_debian10_qt6-Debug(默认Debug)中生成可执行文件cube:

qt_cross_compiling17.png

然后复制可执行文件到板卡系统上,可以通过scp,nfs等等方式传输到板卡:

# 这里使用scp命令,传输cube可执行文件到板卡用户目录下
scp cube cat@192.168.103.102:~

由于这里直接复制可执行文件到板卡,并没有打包所需Qt6的库,那么我们就直接在板卡上添加下野火网盘提供的编译好是Qt6的所有库文件, 复制 网盘 鲁班猫->1-野火开源图书_教程文档->Qt教程相关源文件->debian10->Qt6.2.4目录下的文件lubancat_qt6_debian10.tar.gz到板卡系统,执行解压命令:

# 解压到板卡系统目录/opt下,需要注意这个为鲁班猫debian10系统提供的。
sudo tar -xzf  lubancat_qt6_debian10.tar.gz -C  /opt

添加程序运行所需的库后,我们可以添加到系统的库搜索路径中(/etc/ld.so.conf.d/),也可以直接在导出下环境变量:

# 这里测试就直接导出下环境变量,然后运行程序,支持触摸或者鼠标需要使用root权限
LD_LIBRARY_PATH=/opt/lubancat_qt6_debian10/lib ./cube -platform eglfs

板卡上运行结果(鲁班猫板卡是Debian10系统,接mipi dsi 5.5寸屏幕):

qt_cross_compiling17.png

单独使用cmake命令行构建工程, 参考下 这里

上面使用的都是交叉编译好的基础Qt库,想单独交叉编译Qt库或者单独编译Qt模块参考下后面交叉编译章节。