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
。
添加的工程目录:
然后点击构建(教程测试选择的是debug),构建编译工程会先编译QtUI和SKin库,然后编译APP工程,需要等待下:
在构建完成后,可以看到 lubancat_debian_qt_demo/app_bin
目录下存在FireApp可执行程序,如下图所示:
使用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. 板卡远程部署运行¶
设置下远程部署运行环境,具体参考下前面环境搭建的 远程连接 章节。 配置下远程连接设备:
提示
部署测试板卡ssh需要允许root登录,打开板卡系统/etc/ssh/sshd_config文件,在文件中添加 PermitRootLogin yes
,然后重启sshd服务。
然后在编译套件 Lubancat_rk_debian10
中添加远程连接的设备:
点击 项目
,然后点击编译套件的运行,设置下运行命令:
点击编译运行按钮,Creator会先编译工程(前面单独点击过构建工程会很快结束编译),
然后将app_bin/目录下文件和相关库(不包括使用的Qt库)部署到板卡指定目录下(/usr/local/和/usr/lib下),
最后执行前面设置的运行脚本 /usr/local/qt-app/run_xcb.sh
:
点击应用程序输出:
板卡上运行结果:
运行脚本的内容解释参考下后面章节,还需要注意在板卡上安装好交叉编译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程序。