Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)

简介: Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)

若该文为原创文章,未经允许不得转载

原博主博客地址:https://blog.csdn.net/qq21497936

原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/85396652

各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究若该文为原创文章,未经允许不得转载

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

OpenCV开发专栏(点击传送门)

 

前言

      做跨平台开发经常遇见程序打包,打包不可怕,可怕的是明明打包完了,却在裸机上运行出现插件错误,明明拷入插件库为啥还是会加载xcb失败呢(当前场景仅测试ubuntu)?下面根据需求完成打包流程。

 

需求

      发布qt应用程序,解压后直接可以运行。

 

打包流程

步骤一:基础依赖库打包(创建打包脚本)

      在开发机上生成需要发布的应用,如下图:

     

      创建copyLibs.sh脚本,拷贝下列脚本内容,该脚本是用于拷贝应用所依赖的库至当前文件夹:

#!/bin/sh 
# 发布程序的名称(参数1,执行脚本时输入)
exe=$1
# 修改输出可执行文件路径(当前路径)
destDir=`pwd`
# ldd将所有依赖库生成字符串组(#注意if后的空格只有一个)
dependenLibsList=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }') 
# 将字符串组里面的库拷贝到目标文件夹
cp $dependenLibsList $destDir

      指令如下:

gedit copyLibs.sh

      将上述脚本拷贝进去后保存,如下图:

       

      然后执行:

chmod +x copyLibs.sh
./copyLibs.sh

      如下图:

     

步骤二:运行脚本(创建运行脚本)

      创建运行脚本,在目标机上运行的时候,需要将qt的环境变量加入,方便找寻依赖库的路径等等,创建运行脚本,脚本名必须是”应用名.sh”,执行如下指令:

     

      在myApp.sh输入以下脚本:

#!/bin/sh 
# 获取应用名称(如应用名称为app,那么脚本为app.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 "$@"

      myApp.sh截图如下:

     

      读者可以直接运行,可以得出开发机运行成功。

步骤三:补充插件

      运行到目标机(虚拟机裸ubuntu16.04 amd64)上,运行如下图,需要补充插件文件夹:

     

      以上这种情况是需要拷贝到平台插件文件夹到应用目录下,所有发布程序都需要拷贝platforms文件夹,主要是拷贝发布的平台所对应的插件,如下图:

     

      可以全部拷贝,省事,或者只拷贝xcb(ubuntu只用到这个)。

      笔者这里拷贝整个文件夹,将其他的都删掉,只剩libqxcb.so,运行仍然是加载插件xcb失败。

      其实这个时候插件是存在了,也加载到了,为什么加载失败呢,是因为xcb插件本身依赖一些库,而这些库在ldd里面并没有体现出来(应用中没有用到)。

步骤四:运行调试插件(重点解决xcb加载失败)

      这里调试时,有一个技巧,打开插件调试配置:

export QT_DEBUG_PLUGINS=1

      然后再运行应用脚本,可查看插件加载过程,如下图:

     

      缺少libQt5XcbQpa.so.5,将该库拷贝到应用目录下,这里注意qt库只有libQt5XcbQpa.so.5.9.3是实体,如libQt5XcbQpa.solibQt5XcbQpa.so.5libQt5XcbQpa.so.5.9都是连接文件,拷贝时特别注意,别只拷贝了连接,那是不会有作用的,具体如下图:

     

      在开发机上,库的路径在Qt安装目录下,如下图:

     

      此时,我们直接拷贝libQt5XcbQpa.so.5.9.3到应用目录下,并改名为libQt5XcbQpa.so.5即可,继续运行脚本,如下图:

     

      所以,按照上述方法继续拷贝libQt5Dbus.so.5库,然后运行脚本,即可运行成功!!!

步骤五:优化步骤一的基础依赖库打包脚本

      读者可以将xcb平台libQt5XcbQpa.so.5和libQt5Dbus.so.5通过脚本写入copyLibs.sh,从而运行一个脚本即可,省略步骤四(主要是偶尔用到,经常忘记导致有点麻烦  =_= )。

      添加什么脚本进去,欢迎读者自行补充,欢迎提交评论,笔者就不做了。

 

运行包

      将打包流程最后的包打成一个tar,放到目标机上解压后,直接运行脚本即可,也可以达成deb或者其他ubuntu可运行的软件安装包,具体方法请读者自行百度,笔者暂时没这方面的需求。

 

注意ubuntu18.04的兼容问题(2020年3月6日)

今天遇到读者求助,说按照本文章方法,在ubuntu18.04无法打包,经过笔者晚上几个小时的问题定位,确实发现ubuntu18在系统方面做了一些变化,首先是运行脚本不能用了,其次是库开启QT_DEBUIG_PLUGINS=1后,提示也变了(读者卡了几天),笔者晚上花了大两个小时去定位。

对于上面所提到的,笔者也打过播放器的包,其他库的应用包,也是在ubutnu18.04却没有此类兼容性的问题,脚本也可用,具体要去对比为什么,笔者不在去研究,但笔者保证按照本文章方法,绝大情况是可行的。

若其他读者遇到类似的问题,那么具体的问题需要具体分析,解决不了可以求助博主,毕竟时间就是钱,本博客不会再更新兼容新的系统。

原博主博客地址:https://blog.csdn.net/qq21497936

原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/85396652


相关文章
|
3月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
298 3
|
5天前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
5天前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
19 10
|
4天前
|
C语言 C++ Windows
QT多插件通信框架CTK编译记录
本文记录了编译QT多插件通信框架CTK的过程,包括编译结果截图、部署配置、Log4Qt编译配置、参考链接和拓展资料。文中提供了详细的编译步骤和配置文件示例,以及相关的资源链接。
QT多插件通信框架CTK编译记录
|
2月前
|
机器学习/深度学习 Ubuntu 数据挖掘
Ubuntu系统部署Anaconda环境及Python语言的详细流程
以上就是在Ubuntu系统中安装Anaconda环境及Python语言的详细流程。Anaconda为Python科学计算提供了便捷的管理方式,帮助用户轻松处理不同项目之间依赖管理的复杂性。通过以上步骤,你现在应该有了一个完全可用的Anaconda环境,可以开始在Ubuntu上进行Python编程和数据科学项目的探索了。
40 5
|
2月前
QT 软件打包为一个单独可执行.exe文件流程
QT 软件打包为一个单独可执行.exe文件流程
165 0
|
2月前
QT6使用CMamke将qml打包成dll
QT6使用CMamke将qml打包成dll
26 0
|
2月前
|
机器学习/深度学习 Ubuntu 数据挖掘
揭秘:Ubuntu系统下部署Anaconda环境及Python语言的终极指南!跟随这一步步神秘流程,解锁编程大师的秘密武器!
【8月更文挑战第19天】在Ubuntu中部署Anaconda环境与Python相当直观。首先需从官网下载Linux版安装包。接着,在终端依次执行命令:添加Anaconda清华镜像源至软件源列表,更新软件包信息,然后安装Anaconda。安装后可通过`anaconda --version`验证。使用`anaconda create -n myenv python=3.8`创建名为“myenv”的环境并指定Python 3.8版本。
145 0
|
3月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
|
3月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
125 6
下一篇
无影云桌面