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 Creator中example没有显示如上图所示例程,可以点击 file
, 然后选择打开工程所在的目录:
到系统目录/usr/lib/aarch64-linux-gnu/qt5/examples下寻找相应的例程, analogclock例程在gui/analogclock目录下,点击选择analogclock.pro:
注意:打开的/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 Creator左下角的编译运行符号,如果顺利会弹出一个时钟窗口:
前面是使用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库文件、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 Versions,随后设置名称,设置路径 /opt/qt-everywhere-src-5.15.8/host/bin/qmake :
添加交叉编译器,添加C/C++交叉编译器,选择路径 /opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin :
添加编译套件(名称为Lubancat_rk_debian10),选择前面添加的Qt 版本和交叉编译器,并设置sysroot路径 /opt/sysroot , 顺便为编译套件加一个鲁班猫的图标:
3.2.2. 编译Qt程序¶
打开Qt Creator,选择一个自带Qt例程(示例是analogclock),然后设置工程的编译套件(Lubancat_rk_debian10),设置项目构建目录:
点击编译:
会在构建目录下生成可执行文件:
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
提示
以上部署测试都是通过命令中设置运行环境变量,我们也可以添加到一个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目录下:
获取该目录下所有文件,复制到虚拟机的/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 版本
,手动添加:
然后点击 编译器
, 添加前面从网盘获取的交叉编译器:
如果使用qmake,需要添加远程部署设备,参考下后面 远程连接章节 。
前面配置了相关组件,接下来我们添加一个编译套件( lubancat_rk356x_debian10_qt6
),用来搭建一个交叉编译环境,为鲁班猫板卡编译Qt程序。
我们添加前面配置的交叉编译器,如果前面添加了远程部署设备,也可以添加到Kit。 然后配置使用系统的cmake(注意使用3.16版本以上),配置cmake generator使用makefile(也可以使用ninja等):
并且要修改下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):
最后显示的工程文件:
点击编译,就会在默认的构建目录文件夹build-cube-lubancat_rk356x_debian10_qt6-Debug(默认Debug)中生成可执行文件cube:
然后复制可执行文件到板卡系统上,可以通过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寸屏幕):
单独使用cmake命令行构建工程, 参考下 这里 。
上面使用的都是交叉编译好的基础Qt库,想单独交叉编译Qt库或者单独编译Qt模块参考下后面交叉编译章节。