1. 野火demo 编译和打包

接下将讲解在LubanCat上部署Qt应用程序,需要交叉编译程序,然后打包运行程序的库依赖,最后设置板卡运行环境。

我们将以野火demo为例,讲解Qt应用程序的交叉编译,打包,部署。 野火demo主要为LubanCat板卡提供一个Qt的综合应用程序示例, 从最基础的控件到UI,从单个App示例到最终demo,从程序代码到硬件控制,甚至是工程管理和编程思想。

获取野火Demo源码时注意,LubanCat RK系列板卡使用rk_qt_demo分支。

提示

野火demo目前正在适配中,一些功能使用不了。目前主要用来简单演示下Qt程序的编译、打包、部署运行等操作。

1.1. 使用Qt Creator交叉编译

前面环境搭建章节,演示了在虚拟机ubuntu20.04中搭建的交叉编译Qt环境,我们将使用该环境交叉编译野火FireApp。 如果你的系统没有交叉编译环境,参考下前面 虚拟机上交叉编译Qt 章节。

首先从github或者gitee上拉取对应的仓库到本地,-b rk_qt_demo 表示获取rk_qt_demo分支代码。

提示

测试是在鲁班猫debian10带桌面的系统,Qt Creator编译工具链为我们自己配置的Qt kit。另外,注意测试的仓库分支为 rk_qt_demo, 使用git命令 git branch 可以查看当前分支,git checkout xxx 可以手动切换分支,xxx为切换的目标分支。

1.1.1. 编译qt_demo工程

从gitee拉取:

git clone -b rk_qt_demo https://gitee.com/Embedfire/ebf_linux_qt_demo

打开Qt Creator,添加QtUi进行单独的编译,通过Qt Creator界面的[文件]->[添加文件或项目],选择 lubancat_debian_qt_demo/FireApp.pro , 在添加工程的时候会让你选择构建套件,而交叉编译套件则是我们前面章节配置的 Lubancat_rk_debian10

qt_demo

添加的工程目录:

qt_demo

然后点击构建(教程测试选择的是debug),构建编译工程会先编译QtUI和SKin库,然后编译APP工程,需要等待下:

qt_demo

在构建完成后,可以看到 lubancat_debian_qt_demo/app_bin 目录下存在FireApp可执行程序,如下图所示:

qt_demo

使用file命令查看FireApp可执行程序的信息:

~/gitlab/ebf_linux_qt_demo/app_bin$ file FireApp
FireApp: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter
/lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with debug_info, not stripped

1.1.2. 板卡远程部署运行

设置下远程部署运行环境,具体参考下前面环境搭建的 远程连接 章节。 配置下远程连接设备:

qt_demo

提示

部署测试板卡ssh需要允许root登录,打开板卡系统/etc/ssh/sshd_config文件,在文件中添加 PermitRootLogin yes,然后重启sshd服务。

然后在编译套件 Lubancat_rk_debian10 中添加远程连接的设备:

qt_demo

点击 项目 ,然后点击编译套件的运行,设置下运行命令:

qt_demo

点击编译运行按钮,Creator会先编译工程(前面单独点击过构建工程会很快结束编译), 然后将app_bin/目录下文件和相关库(不包括使用的Qt库)部署到板卡指定目录下(/usr/local/和/usr/lib下), 最后执行前面设置的运行脚本 /usr/local/qt-app/run_xcb.sh

qt_demo

点击应用程序输出:

qt_demo

板卡上运行结果:

qt_demo

运行脚本的内容解释参考下后面章节,还需要注意在板卡上安装好交叉编译Qt库环境,具体请参考前面Qt程序编译章节。

1.2. 命令行交叉编译

先导出Qt交叉编译的环境变量,测试下Qt版本:

export PATH=/opt/qt-everywhere-src-5.15.8/host/bin:$PATH

输入命令验证Qt版本:

qmake -v

若环境变量设置正确,则会出现以下信息:

QMake version 3.1
Using Qt version 5.15.8 in /opt/qt-everywhere-src-5.15.8/ext/lib

以上是验证SDK安装是否成功!!

拉取qt_demo源码:

gitee

git clone -b mark_qt_demo ster https://gitee.com/Embedfire/lubancat_linux_qt_demo/

切换到tools目录,执行build.sh脚本编译:

cd tools/
./build.sh

如果 build.sh 不是可执行文件,可以使用以下命令添加可执行权限

chmod +x build.sh

查看生成的文件:

cd lubancat_linux_qt_demo

# 查看FireApp可执行文件
ls -al app_bin/FireApp
-rwxrwxr-x 1 llh llh 44534696 7月  14 14:35 app_bin/FireApp

# 查看Skin,QtUi库文件
ls thirdpart/libskin/lib/* thirdpart/libqui/lib/*
thirdpart/libqui/lib/libQtUi.so      thirdpart/libqui/lib/libQtUi.so.1.0.0  thirdpart/libskin/lib/libSkin.so.1.0
thirdpart/libqui/lib/libQtUi.so.1    thirdpart/libskin/lib/libSkin.so       thirdpart/libskin/lib/libSkin.so.1.0.0
thirdpart/libqui/lib/libQtUi.so.1.0  thirdpart/libskin/lib/libSkin.so.1

清除编译相关内容,在lubancat_linux_qt_demo目录下使用命令:

make distclean

在板卡上运行,需要将app_bin文件和生成的库(libSkin)拷贝到板卡,配置好环境变量,执行app_bin文件中的run_xcb.sh脚本。

1.3. 打包程序

这小节讲讲如何将野火demo打包(deb包)。

野火qt_demo工程分为三个子项目,App,QtUi和Skin。 App文件夹中包括主程序,QtUi则是界面类的实现,Skin则是资源文件,QtUi和Skin最终以动态库的形式被App调用。 App中还会使用到很多资源以及部分配置文件等等这些都是需要打包进安装包的。

1.3.1. 使用脚本打包

在工程目录下有提供一个打包脚本tools/dpkg_lubancat_qtdemo.sh, 切换到tools目录,随后执行脚本:

cd tools/
./dpkg_lubancat_qtdemo.sh

dpkg_lubancat_qtdemo.sh 脚本内容如下:

Version=1.3.0.0
Package=fireapp_1.3.0.0_arm64.deb

#deb包 临时目录
PackageDir=../ebfdemo

cd ../
mkdir -p  $PackageDir

USRLIB=$PackageDir/usr/lib
mkdir -p ${USRLIB}

# qtui和skin库
cp -rf thirdpart/libskin/lib/*          ${USRLIB}
cp -rf thirdpart/libqui/lib/*           ${USRLIB}

#字体
#USRFONT=$PackageDir/usr/share/fonts
#mkdir -p ${USRFONT}
#cp -r    ttf/*                                      ${USRFONT}

#输入法
#INPUT=$PackageDir/usr/lib/arm-linux-gnueabihf/qt5/plugins/platforminputcontexts/
#mkdir -p ${INPUT}
#cp -r conf/plugins/platforminputcontexts/libSoft-keyboard.so ${INPUT}

# 可旋转的 linuxfb
#LinuxFb=$PackageDir/usr/lib/plugins/platforms/
#mkdir -p ${LinuxFb}
#cp -r conf/plugins/platforms/libqlinuxfb.so         ${LinuxFb}

# 添加可执行程序,以及资源文件和配置文件
APPINSTALL=$PackageDir/usr/local/qt-app
mkdir -p ${APPINSTALL}
cp -rf app_bin/* ${APPINSTALL}

# 添加system服务程序,自启动运行FireApp
mkdir -p $PackageDir/lib/systemd/system
cp tools/ebf-qtdemo.service $PackageDir/lib/systemd/system/

# 添加deb包控制信息
mkdir -p $PackageDir/DEBIAN

cp tools/control   $PackageDir/DEBIAN/
cp tools/postinst  $PackageDir/DEBIAN/

# 打包
dpkg -b $PackageDir $Package

# 删除临时文件
rm -rf $PackageDir

echo -e "Package complete"

脚本进行了如下工作

  • 复制我们指定的文件到ebfdemo文件中,比如我们交叉编译的qtui和skin的lib等,ebfdemo相当于程序安装的根目录root

  • 添加程序控制信息,设置程序的自启动,依赖,标明程序架构等等信息

  • 打包程序。

最终就会在工程目录下生成fireapp_1.3.0.0_arm64.deb包文件,其版本为1.3.0.0。 关于dpkg打包,更多详细参考下 这里

需要注意的是,使用这脚本打包没有添加依赖的Qt5库,我们默认板卡系统已经把交叉编译的Qt库放到了/opt/qt-everywhere-src-5.15.8/ext/lib目录下。

1.3.2. 查看和安装deb包

打包使用dpkg命令可以查看和提取包的内容:

# dpkg查看deb包的内容
dpkg -c fireapp_1.3.0.0_arm64.deb
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./lib/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./lib/systemd/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./lib/systemd/system/
-rw-rw-r-- llh/llh         145 2023-07-15 15:33 ./lib/systemd/system/ebf-qtdemo.service
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/lib/
-rwxrwxr-x llh/llh    14635776 2023-07-15 15:33 ./usr/lib/libQtUi.so.1.0.0
-rwxrwxr-x llh/llh     4787120 2023-07-15 15:33 ./usr/lib/libSkin.so.1.0.0
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/
-rwxrwxr-x llh/llh    44534696 2023-07-15 15:33 ./usr/local/qt-app/FireApp
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/conf/
-rw-rw-r-- llh/llh       81478 2023-07-15 15:33 ./usr/local/qt-app/conf/asound.state
-rw-rw-r-- llh/llh      464109 2023-07-15 15:33 ./usr/local/qt-app/conf/city.json
-rw-rw-r-- llh/llh          93 2023-07-15 15:33 ./usr/local/qt-app/conf/config.ini
-rw-rw-r-- llh/llh         190 2023-07-15 15:33 ./usr/local/qt-app/conf/cursor.json
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/conf/lib/
-rw-rw-r-- llh/llh       31824 2023-07-15 15:33 ./usr/local/qt-app/conf/lib/libgstaudiodecoder.so
-rw-rw-r-- llh/llh      298632 2023-07-15 15:33 ./usr/local/qt-app/conf/lib/libgstcamerabin.so
-rw-rw-r-- llh/llh      217676 2023-07-15 15:33 ./usr/local/qt-app/conf/lib/libgstmediacapture.so
-rw-rw-r-- llh/llh      143364 2023-07-15 15:33 ./usr/local/qt-app/conf/lib/libgstmediaplayer.so
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/conf/plugins/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/conf/plugins/platforminputcontexts/
-rw-rw-r-- llh/llh      462248 2023-07-15 15:33 ./usr/local/qt-app/conf/plugins/platforminputcontexts/libSoft-keyboard.so
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/conf/plugins/platforms/
-rwxrwxr-x llh/llh      253652 2023-07-15 15:33 ./usr/local/qt-app/conf/plugins/platforms/libqlinuxfb.so
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/dict/
-rw-rw-r-- llh/llh     1068442 2023-07-15 15:33 ./usr/local/qt-app/dict/dict_pinyin.dat
-rw-rw-r-- llh/llh         236 2023-07-15 15:33 ./usr/local/qt-app/dict/dict_pinyin_user.dat
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/ebook/
-rw-rw-r-- llh/llh       80416 2023-07-15 15:33 ./usr/local/qt-app/ebook/仙逆-上.txt
-rw-rw-r-- llh/llh       67540 2023-07-15 15:33 ./usr/local/qt-app/ebook/仙逆-下.txt
-rw-rw-r-- llh/llh       80071 2023-07-15 15:33 ./usr/local/qt-app/ebook/仙逆-中.txt
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/lib/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/lrc/
-rw-rw-r-- llh/llh        1082 2023-07-15 15:33 ./usr/local/qt-app/lrc/猪之歌-香香.lrc
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/music/
-rw-rw-r-- llh/llh        1082 2023-07-15 15:33 ./usr/local/qt-app/music/猪之歌-香香.lrc
-rw-rw-r-- llh/llh     3224682 2023-07-15 15:33 ./usr/local/qt-app/music/猪之歌-香香.mp3
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/nes/
-rw-rw-r-- llh/llh       40976 2023-07-15 15:33 ./usr/local/qt-app/nes/SuperMarie.nes
-rwxrwxr-x llh/llh       65552 2023-07-15 15:33 ./usr/local/qt-app/nes/冒险岛1.nes
-rwxrwxr-x llh/llh      262160 2023-07-15 15:33 ./usr/local/qt-app/nes/冒险岛2.nes
-rwxrwxr-x llh/llh      262160 2023-07-15 15:33 ./usr/local/qt-app/nes/冒险岛3.nes
-rwxrwxr-x llh/llh       24719 2023-07-15 15:33 ./usr/local/qt-app/nes/坦克大作战.nes
-rwxrwxr-x llh/llh      524304 2023-07-15 15:33 ./usr/local/qt-app/nes/忍者神龟3无限人.nes
-rwxrwxr-x llh/llh      262160 2023-07-15 15:33 ./usr/local/qt-app/nes/次银战士.nes
-rwxrwxr-x llh/llh       24592 2023-07-15 15:33 ./usr/local/qt-app/nes/疯狂赛车.nes
-rwxrwxr-x llh/llh       40976 2023-07-15 15:33 ./usr/local/qt-app/nes/超级玛丽无敌版.nes
-rwxrwxr-x llh/llh      262160 2023-07-15 15:33 ./usr/local/qt-app/nes/雪人兄弟.nes
-rwxrwxr-x llh/llh       65552 2023-07-15 15:33 ./usr/local/qt-app/nes/飞机救人.nes
-rwxrwxr-x llh/llh      262160 2023-07-15 15:33 ./usr/local/qt-app/nes/魂斗罗.nes
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/notepad/
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/photos/
-rw-rw-r-- llh/llh      214224 2023-07-15 15:33 ./usr/local/qt-app/photos/1.jpg
-rw-rw-r-- llh/llh      284850 2023-07-15 15:33 ./usr/local/qt-app/photos/2.jpg
-rw-rw-r-- llh/llh      712239 2023-07-15 15:33 ./usr/local/qt-app/photos/3.jpg
-rw-rw-r-- llh/llh      762510 2023-07-15 15:33 ./usr/local/qt-app/photos/4.jpg
-rw-rw-r-- llh/llh      826727 2023-07-15 15:33 ./usr/local/qt-app/photos/5.png
-rw-rw-r-- llh/llh      422517 2023-07-15 15:33 ./usr/local/qt-app/photos/6.png
-rw-rw-r-- llh/llh     1115300 2023-07-15 15:33 ./usr/local/qt-app/photos/7.png
-rw-rw-r-- llh/llh     1100297 2023-07-15 15:33 ./usr/local/qt-app/photos/8.png
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/record/
-rw-rw-r-- llh/llh       39084 2023-07-15 15:33 ./usr/local/qt-app/record/call_coming.wav
-rw-rw-r-- llh/llh       48044 2023-07-15 15:33 ./usr/local/qt-app/record/net_off.wav
-rwxrwxr-x llh/llh        4909 2023-07-15 15:33 ./usr/local/qt-app/run_eglfs.sh
-rwxrwxr-x llh/llh        3487 2023-07-15 15:33 ./usr/local/qt-app/run_myapp.sh
-rwxrwxr-x llh/llh        3490 2023-07-15 15:33 ./usr/local/qt-app/run_pyqt5.sh
-rwxrwxr-x llh/llh        1256 2023-07-15 15:33 ./usr/local/qt-app/run_xcb.sh
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/translations/
-rw-rw-r-- llh/llh       14094 2023-07-15 15:33 ./usr/local/qt-app/translations/qt_en.qm
-rw-rw-r-- llh/llh          23 2023-07-15 15:33 ./usr/local/qt-app/translations/qt_zh.qm
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/ttf/
-rw-rw-r-- llh/llh          36 2023-07-15 15:33 ./usr/local/qt-app/ttf/.uuid
-rw-rw-r-- llh/llh    23613536 2023-07-15 15:33 ./usr/local/qt-app/ttf/SourceHanSerifSC-Regular.otf
drwxrwxr-x llh/llh           0 2023-07-15 15:33 ./usr/local/qt-app/video/
-rw-rw-r-- llh/llh     2452702 2023-07-15 15:33 ./usr/local/qt-app/video/123.mp4
lrwxrwxrwx llh/llh           0 2023-07-15 15:33 ./usr/lib/libQtUi.so -> libQtUi.so.1.0.0
lrwxrwxrwx llh/llh           0 2023-07-15 15:33 ./usr/lib/libQtUi.so.1 -> libQtUi.so.1.0.0
lrwxrwxrwx llh/llh           0 2023-07-15 15:33 ./usr/lib/libQtUi.so.1.0 -> libQtUi.so.1.0.0
lrwxrwxrwx llh/llh           0 2023-07-15 15:33 ./usr/lib/libSkin.so -> libSkin.so.1.0.0
lrwxrwxrwx llh/llh           0 2023-07-15 15:33 ./usr/lib/libSkin.so.1 -> libSkin.so.1.0.0
lrwxrwxrwx llh/llh           0 2023-07-15 15:33 ./usr/lib/libSkin.so.1.0 -> libSkin.so.1.0.0

将打包好的deb安装到鲁班猫板卡是,需要先将deb包拷贝到开发板上,依次执行下面的命令:

sudo dpkg -i fireapp_1.3.0.0_arm64.deb

sudo apt-get -f -y install

建议板卡连接网络之后再才安装deb包,安装一些运行需要的库。

安装成功之后,我们可以重启鲁班猫板卡或者使用下面命令:

sudo systemctl restart  ebf-qtdemo.service

板卡就会运行qt demo程序。