QT程序打包部署教程

QT程序打包部署教程

​ 本文讲述如何把deepin系统下开发qt程序打包并部署到测试环境中,测试环境如deepin,ubuntu。

1、开发环境

​ 开发系统:deepin V20版本

​ 开发工具:qt5.14.2,IDE->QtCreator

​ 编译生成Realse版本的可执行文件 EClient

2、测试环境

​ 测试系统:以deepin V20版本和ubuntu 18.04版本来测试。

3、脚本打包教程

​ 以可执行文件命名新建文件夹EClient,把可执行文件拷贝到其中,然后新建脚本文件copylib.sh,如下

#!/bin/sh
exe="EClient" #你需要发布的程序名称
des="/home/uos/EClient" #创建文件夹的位置
deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des

​ 上述脚本是通过ldd 获取EClient依赖的库,然后拷贝到"/home/uos/EClient"中
在这里插入图片描述

​ 在EClient目录下新建脚本EClient.sh,内容如下

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"

​ EClient.sh是官方推荐的启动脚本,在启动应用前添加依赖库的环境变量。把目录下的copylib.sh、EClient、EClient.sh添加可执行属性

sudo chmod 777 *

接下来运行脚本copylib.sh,拷贝依赖库,结果如下
在这里插入图片描述

​ 接下来需要到qt安装目录(/home/uos/Qt5.14.2/5.14.2/gcc_64/)下拷贝qt的/plugins/platform,整个platforms文件夹拷贝过去,现在的目录结果如下:
在这里插入图片描述
在这里插入图片描述

实际只用到libqxcb.so,该库是在qt程序启动时加载,如果没有此库程序将启动失败。

deepin测试

​ 接下来把EClient整个目录拷贝到测试系统deepin V20上测试,首先执行如下命令,添加执行权限:

sudo chmod 777 *

​ 然后执行EClient.sh

./EClient.sh

在这里插入图片描述

​ 程序在deepin 调试时运行正常,可以确定不是程序本身的问题,可能是链接个库时出了问题,下面开始排查原因。

export QT_DEBUG_PLUGINS=1

​ 上述命令可以打开qt程序的调试信息,然后就可以看到具体出错信息

在这里插入图片描述

​ 可以看到运行过程加载了系统自带的库libQt5XcbQpa.so.5,此时需要换成开发环境中qt安装目录下的库,在

/home/uos/Qt5.14.2/5.14.2/gcc_64/lib下,拷贝到ECient目录即可,注意需要做个软链接或者直接修改名称,再次运行又出现了错误。

在这里插入图片描述

“Cannot mix incompatible Qt library with this library”,其中0x50b03指qt5.11.3,0x50e02指qt5.14.2,意思是5.14.2版本的库使用了5.11.3版本的库,冲突,使用ldd libqxcb.so的依赖库,可以发现具体那个库冲突。

在这里插入图片描述

上述结果中可以看出libQt5DBus.so.5同样使用的是系统自带的库,需要使用qt安装目录下的库,在/home/uos/Qt5.14.2/5.14.2/gcc_64/lib下,拷贝到EClient下即可,注意需要做个软链接或者直接修改名称。再次运行ldd libqxcb.so,可以看出已经使用了拷贝的库。

在这里插入图片描述

再次运行./EClient.sh,程序可以正常启动

ubuntu测试

​ 将上诉成功的整个文件夹EClient拷贝到ubuntu18.04上,文件内容如下

在这里插入图片描述

​ 此时,如果直接运行./EClient.sh会报段错误,段错误一般是由于非法访问内存引起的,正常情况下程序是没有问题,如果有问题,像这种段错误在调试结果就会暴露,因此考虑其它原因,后来发现在export LD_LIBRARY_PATH后就会出现segfault,因此可以断定是库冲突导致的,接下来排查,首先把目录下的库文件全部备份并删除(一会儿还用到),只剩下如图所示文件。

在这里插入图片描述

然后运行ldd EClient,查看EClient依赖库,如下图

在这里插入图片描述

​ 把依赖的这些qt的库拷贝到EClient目录下,然后运行如下命令,添加库搜索路径为程序运行目录:

export LD_LIBRARY_PATH=/home/rootuser/EClient:$LD_LIBRARY_PATH

​ 下述命令可以打开qt程序的调试信息,然后就可以看到具体出错信息

export QT_DEBUG_PLUGINS=1

​ 然后再次运行./EClient,出错信息如下:

在这里插入图片描述

​ 此时再次运行ldd EClient,查看依赖文件

在这里插入图片描述

需要把libicui18n.so.56,libicuuc.so.56,libicudata.so.56拷贝到EClient目录下,然后再次运行./EClient,发现程序启动正常。

4、deb打包教程

​ deb安装包可以理解为是类似windows系统的自解压包,运行后可以把文件释放到相应的目录,然后启动执行相应的脚本,deb打包需要准备如下目录结构。

在这里插入图片描述

​ 以程序名称新建EClient文件夹,然后在下面一次创建DEBIAN、opt、usr文件夹,DEBIAN下面放置的是control文件,该文件设置的信息会出现在安装界面上,可选如下示例:

package:EClient
version:1.0.1
architecture:amd64
maintainer:jiangyingfeng
description:EClient安装包

​ 上述内容必须空一行再结束(见网上文章说明)

​ opt目录下直接新建EClient文件夹,然后把EClient程序的所有依赖库都放进来,注意可以把文章第3节中的整个目录文件拷贝进来,因为第3节讲述的文件是经过调试后可以正确运行的。

​ usr目录下新建share文件夹,然后在其下面创建application文件夹,然后再创建EClient.desktop文件,注意一定是以程序名命名的.desktop文件,其文件内容示例如下

[Desktop Entry]
Encoding=UTF-8
Name=EClient
Comment=测试客户端
Exec=/opt/EClient/EClient
Icon=64.png
Terminal=false
StartupNotify=false
Type=Application
Categories=Application;Development;

​ 上述字段含义可以查网上资料。

​ icons目录存放应用程序图标,在deskop文件中的Icon字段用到。

​ 文件都准备好了,接下来就是运行dpkg来生成deb包,注意第2个参数是文件目录,也就是EClient,第3个参数是生成的包名,格式可以是"程序名_版本号__系统架构.deb",命令如下:

sudo dpkg -b EClient EClient_1.0.7_amd64.deb

在这里插入图片描述

直接拷贝deb包到ubuntu或者deepin上安装,安装方式可以为双击,启动安装界直接点击install,或者命名行:dpkg -i 包名,安装界面如下:

在这里插入图片描述
安装完成后会在桌面启动栏出现图标,点击可以运行,或者进入/opt/EClient下面启动程序:

./EClient

5、总结

​ 网上很多关于QT程序如何打包部署的文章,但是实际打包部署到环境中运行可能会遇到各种问题,在开发环境如果调试程序没有问题,那么可以肯定的是库冲突问题,可以参考上述打包教程进行打包。

### H20 算力优化及性能指标分析 #### INT8 和 FP16 的性能提升 英伟达H20在INT8和FP16精度下的表现尤为突出,其设计旨在最大化推理效率并降低延迟。相比前代产品,H20通过架构改进实现了更高的吞吐量,在INT8模式下提供了显著增强的TOPS(Tera Operations Per Second),而在FP16模式下则提升了TFLOPS(Tera Floating-point Operations Per Second)。这种优化使得H20成为机器学习模型部署的理想选择[^2]。 #### FLOPS 性能对比 就FLOPS而言,H20相较于前一代GPU有明显进步。具体来说,它不仅提高了单精度浮点运算能力(FP32),还大幅增强了混合精度计算的支持力度,这对于需要高精度与高效能平衡的应用场景尤为重要。此外,借助Tensor Core的新特性,H20能够在特定工作负载中实现更高倍率的速度增益。 #### 功耗管理与 TDP 设计 功耗方面,尽管H20拥有更强悍的处理能力和更大的晶体管数量,但由于采用了先进的制程技术和高效的电源管理系统,整体能耗得到了有效控制。对于GB300、B300以及HGX平台上的配置版本,各自的热设计功率(TDP)均经过精心调整以适应不同的应用场景需求。例如,在数据中心环境中运行时,即使面对极高负荷的任务也能保持稳定而持久的表现。 #### 前代产品的比较 当我们将目光投向前几代NVIDIA GPU时可以发现,无论是从原始算力还是实际应用效能来看,H20都树立了一个新的标杆。特别是在针对AI训练和推理任务进行了专门调优之后,无论是在每瓦特性能还是单位面积内的计算密度上都有所突破。这表明相对于早期型号如V100或A100等,新一代硬件已经迈入了一个全新阶段——即更加注重可持续发展的同时追求极致性能。 ```python # 示例代码展示如何查询 NVIDIA GPU 的基本规格信息 (伪代码) import nvidia_smi nvidia_smi.nvmlInit() handle = nvidia_smi.nvmlDeviceGetHandleByIndex(0) info = nvidia_smi.nvmlDeviceGetPowerUsage(handle) print(f"Current Power Usage: {info / 1000} W") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feng_blog6688

只需一个赞,谢谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值