[Linux] QT qml项目打包deb时遇到的那些坑

28 篇文章 1 订阅
16 篇文章 0 订阅

背景

开发环境:Ubuntu

项目语言:Qt / qml

需求: 将此qml项目打包为deb安装包的形式。(前提是目标主机可能没有qt环境)

需求分析: 将所有文件(包含软件,相关库,及qt / qml环境)统统打包进deb包中。

经调研,使用dpkg包管理器提供的命令dpkg -b folder test.deb进行打包比较方便 , 既然使用人家的打包工具,就得按照人家的要求来配置文件夹结构,由于网上此类教程很多,就不在此赘述了。

此博文主要说一下打包及测试qt软件阶段遇到的问题。

问题1、如何确定deb包安装时的目录结构

在这里插入图片描述
我的目录结构如上图所示, DEBIAN为deb包的管理框架, opt为我要存放的软件的目录,usr 下我要存放一个类似windows的开始菜单快捷方式。

  • DEBIAN下有五个文件,一个必要文件
文件描述
control[必选]deb包的描述,如包名,版本号等
preinst[可选|bash]在安装此包之前要做的工作, 如创建一个桌面脚本
postinst[可选|bash]在安装完成后执行的操作,如给桌面脚本添加可执行权限
prerm[可选|与preinst类似,此为在卸载前要执行的操作, 如echo 我就要离开你了
postrm[可选|与postinst类似, 此为卸载完成后要执行的操作, 如echo 有缘再见, 无缘再也不见
  • 关于opt 和 usr目录,是经尝试得出的,结论如下: 可以把此目录当做linux上的根目录/, 在这里创建什么文件夹,就会在安装机器的linux根目录创建一个同样的目录, 如这里创建一个test文件夹,那么安装时会自动创建一个/test/文件夹,如果存在则不创建。

比如想把程序放到 /opt/myApp目录下, 就可以在这里创建文件夹 opt, 然后进入opt文件夹创建 myApp文件夹。以此类推。

问题2: 安装完成后,双击执行程序没有反应

此时就介绍几种调试方式(请上大咖 Terminal):

  • 直接终端执行你的应用程序 /opt/myApp/testapp, 就会提示为什么没启动的出错原因,一般是找不到某个库,这时候将库拷贝过来就可以了,并在打包时同步拷贝。

  • 设置临时环境变量 export QT_DEBUG_PLUGINS=1, 可以看到so库的调用情况,是不是调用了其他你不想调用的库文件

  • 设置临时环境变量 export QML_IMPORT_TRACE=1, 可已查看运行时qml调用的情况,即可以看到你的qml是从哪个路径下import的。

  • 设置临时环境变量 export QML2_IMPORT_PATH=/opt/myApp/imports,将此路径设置为你的qml导入路径,确保qml是我想要的那个,而不是其他版本下的。

  • 设置环境变量 export QT_QPA_PLATFORM_PLUGIN_PATH=/your_qt_plugins_path, 设置此变量可以解决下述报错问题。
    当然一般不是这么解决的, 直接将qt下 相应版本 的plugins的所有子目录放到和可执行程序同目录亦可解决此问题。

“Could not find the Qt platform plugin “xcb” in “” (:0, )” FATAL
2021-11-08T10:47:51.678 "This application failed to start because no
Qt platform plugin could be initialized. Reinstalling the application
may fix this proble

问题3: 启动已安装的软件,组件和调试时不相同

这时,需要关注的点还在环境变量上,不过不是设置环境变量,而是环境变量的顺序问题,由于在qm中使用 import xxx时, 程序是按某个特定顺序按目录逐个查找的, 先找到哪个就用哪个,在这里,这个bug我找了两天时间,哪哪都没错,真的是服了。
比如这两段代码的执行结果可能会有天壤之别, 原因呢就是两个imports目录同时包含名称相同版本号也相同的qml组件,导致先运行到哪个,就用哪个。

...
engine.addImportPath("dir1/imports");
engine.addImportPath("qrc:/imports");
...
...
engine.addImportPath("qrc:/imports");
engine.addImportPath("dir1/imports");
...

可以在代码中通过 添加命令打印出应用的import路径的顺序。

...
qDebug()<<engine.importPathList();
...

问题3: qt 运行环境移植

最保险的方法就是将这三个目录都打包进自己的deb包中,本来想着缩减一下,出现了这问题那问题,一气之下就都复制了吧,虽然包大点,但是省心。
plugins/platforminputcontexts

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值