关于Qt程序打包后运行库依赖的常见问题分析及解决方法

这篇具有很好参考价值的文章主要介绍了关于Qt程序打包后运行库依赖的常见问题分析及解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一. 大致如下常见问题:

(1)找不到程序所依赖的Qt库 version `Qt_5' not found (required by

(2)Could not Load the Qt platform plugin "xcb" in "" even though it was found

(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentation fault,或者Illegal instruction (core dumped) 非法指令

(4)ldd 应用程序或者库,查看运行所依赖的库时,直接报段错误

二. 问题逐个分析,得出解决方法:

(1)找不到程序所依赖的Qt库 version `Qt_5' not found (required by

解决方案有如下几种

(2)Could not Load the Qt platform plugin "xcb" in "" even though it was found

 (3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentation fault,或者Illegal instruction (core dumped) 非法指令

 (4)这个问题,在上面已经解决了

最后:

用网上的命令打包QT程序运行时常遇到程序无法运行的提示:

一. 大致如下常见问题:

(1)找不到程序所依赖的Qt库 version `Qt_5' not found (required by

/usr/lib/x86_64-linux-gnu/libQt5Gui.so.5: version `Qt_5' not found (required by ./运行程序名)

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

(2)Could not Load the Qt platform plugin "xcb" in "" even though it was found

qt.qpa.plugin: Could not Load the Qt platform plugin "xcb" in "" even though it was found.

This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

在命令下执行:export QT_DEBUG_PLUGINS=1 ,让程序输出更多信息,再次运行关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 提示platforms文件下的libqxcb.so库缺少依赖库libQt5XcbQpa.so.5

(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentation fault,或者Illegal instruction (core dumped) 非法指令

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

(4)ldd 应用程序或者库,查看运行所依赖的库时,直接报段错误

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

二. 问题逐个分析,得出解决方法:

(1)找不到程序所依赖的Qt库 version `Qt_5' not found (required by

        /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5: version `Qt_5' not found (required by ./运行程序名)

这个是找不到程序依赖库了,在没有安装Qt的裸机下,如果程序没有指定依赖库路径的话,默认是去 /etc/ld.so.conf 文件中指定的搜索路径寻找

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

如果在有开发环境的机子上运行上的话,无论你把程序拿到哪个地方,都能运行,因为运行时会去Qt库里面找,如下所示

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 去新机子上运行,是没有Qt库的,所以需要打包指定程序运行时库依赖的位置

问题分析完了,解决方案也就出来了

解决方案有如下几种

        1.在程序编译时,先在.pro文件下指定程序运行时的库依赖路径(推荐

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

        2.在/etc/ld.so.conf 文件添加程序依赖路径,如下所示,不要将第一个默认的删掉或者改了,否者系统将出大问题,基本什么东西都运行不了(不推荐

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 3.指定临时运行路径,只在当前窗口下有用,这个也是网上常用的方法,然后在运行程序

export LD_LIBRARY_PATH='你的库路径':$LD_LIBRARY_PATH

我比较喜欢用第一种方法,简单明了

(2)Could not Load the Qt platform plugin "xcb" in "" even though it was found

        执行:export QT_DEBUG_PLUGINS=1 , 在运行,提示找不到platforms文件下的libqxcb.so库缺少依赖库libQt5XcbQpa.so.5,如果没有这个库就链接下

        如果我们已经有这个库了,但还是提示的话,说明能找的地方都找了(指定的库位置,/etc/ld.so.conf 文件中指定的位置,临时指定的库位置等等),还是找不到。这个时候就得看一下platforms文件下的libqxcb.so库所运行时所依赖的Qt库路径在哪里

readelf -d 库名称

readelf -d 库名/程序名  可以查看默认依赖/运行库路径:Runpath

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

         可以看到,libqxcb.so库的运行依赖路径是在库所在目录的上级的上级的lib目录下目录:Library runpath: [$ORIGIN/../../lib]

         在Qt中,因为这个库libqxcb.so是Qt自带的,已经开发好的,指定的库依赖位置就是[$ORIGIN/../../lib],所以我们也能看到,在QT下安装目录下,Qt库目录lib目录就是在库libqxcb.so的上级目录的上级目录的位置

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

         所以只要把QT库放在libqxcb.so库所在目录的上级的上级的lib目录下就可以了,也就是platforms文件夹的上一级目录的lib目录下。打包的一般目录结构都是bin目录相同目录下放lib库目录,bin目录下放程序文件,这也是很多软件发布时的标准配置。

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 这样子就没问题啦 关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 (3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentation fault,或者Illegal instruction (core dumped) 非法指令

        如我将ubantu16.04下Qt打包的程序,在裸机的ubantu16.04或者18.04下运行没有,没有问题,但放到ubantu22.04下,直接报Illegal instruction (core dumped) 非法指令,

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

或者其他linux系统下,如deepin(深度系统)下,提示段错误

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

这个错误我搞了半天,ldd程序,程序所有的依赖库都有,为啥还报错呢,搞不懂

想去lib目录下看下库信息,输入ls -l,结果直接报错,很多常用的linux命令在这里都报这个错关于Qt程序打包后运行库依赖的常见问题分析及解决方法

         思考原因,对比了一下其他能正常运行的程序,发现lib目录下很多其他的库文件,我把那些多余的文件都删除了,结果可以输linux命令了,而且程序也能运行了,然后我在我的尝试下,发现就是这些文件搞的鬼,libbc.so.6和libpthread.so.0

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 然后就去查了这些库是干嘛的,一查,所有迷雾都揭开了,如下

libc.so.6是glibc的软链接

        #glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。--百度百科

所以这个软链接很重要!!

        不同的linux系统下,这个libc.so.6库是不一样的,相同的系统下,也可能因为系统的升级,libc.so.6库也就行了的升级,如ubantu16.04和ubantu 22.04的libc.so.6库是不一样的。

        这也就解释了为什么在从ubantu16.04打包过来的库,在ubantu 22.04或者其他linux系统下,在这个库目录执行linux的常用命令,直接报这个Illegal instruction (core dumped) 非法指令的信息,因为本就不是这个系统的。无法识别!

        libc 和 libpthread是linux非常重要的基础库。所以在所在目录下执行命令,最先寻找的就是当前目录下的库和文件。本系统的直接跳过了,不报错误才怪!

所以把他们删掉就可以了

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 (4)这个问题,在上面已经解决了

        既然会出现上面这些问题,那不能避免吗,毕竟我们打包的程序,不可能只在相同版本的系统上运行,可能会拿到低或者高版本的系统,甚至其他linux系统下运行,大概率会踩雷

        要解决这个问题,就要知道出现问题的根源所在,根源就是,库的问题。库从哪里来呢?都是网上执行这个命令后打包拷过去的。所以我们先理解这个打包命令的含义:

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

第四行那个,拷贝的命令

ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }' 

        这个命令:ldd $exe 就是获取程序所依赖的库,然后通过管道|输入给awk命令处理,获取字符串中匹配有/的字符串,然后通过空格隔开,获取第三列,也就是程序所依赖库的路径

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

         然后将所有的库全部拷贝过去,其实很多库都不需要用到,有的/lib/...开头的路径的库是不需要的,这个是linux系统自带的,全部拷过去,会拷个雷库(如libc.so.6)过去,需要拷贝的只有Qt目录下的库文件而已,所以        要对这个拷贝命令就行优化

        所依赖的QT库有一个共同点,都有Qt这两个子眼,所以在那个基础上在过滤一下就行啦

#赋值路径,准备拷贝
copyPathList=$(ldd $exe | awk  -F " " \
'
{
    if ($3 ~ "/Qt")
    { 
		 printf("%s\n"),$3
    }
}
')

最后:

写这篇博客,花了很多时间,都花这个份上了,我就把所有的打包的原创脚本代码都写出来了,想要的自己拿吧,脚本式打包,链接啥的,都给弄好了,贴心,注释都写好了,不会改的,在评论区留言吧,或者评论区交流下。对你有用的点个赞在走吧

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

.pro文件先指定下程序运行时要寻找的库路径

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

 一键程序所需QT库打包shell脚本:文章来源地址https://www.toymoban.com/news/detail-415889.html

#!/bin/sh
exe="RFIDReaderTest" #要打包的程序名 *
#获取当前路径
currentPath=$(cd `dirname $0`; pwd)

#打包的Qt库位置 *
packDes="$currentPath/../lib" 
#程序依赖库所在位置,用于打包依赖库需要的Qt库,没有留空即可,即myLibPath=""  *
myLibPath="$currentPath/myLib"
#删除原有文件夹,新建新文件夹,存储Qt库
rm -r $packDes
mkdir $packDes

#----------获取程序所依赖的‘Qt库’路径--------------
echo "------------正在获取程序所依赖的‘Qt库’--------------"
#输出程序所依赖的Qt库
ldd $exe | awk  -F " " \
'
{
    if ($3 ~ "/Qt")
    { 
		 printf("%s\n"),$3
    }
}
'
#赋值路径,准备拷贝
copyPathList=$(ldd $exe | awk  -F " " \
'
{
    if ($3 ~ "/Qt")
    { 
		 printf("%s\n"),$3
    }
}
')

#拷贝‘Qt库’文件到打包文件夹路径中
cp $copyPathList $packDes

echo "---正在打包libQt5XcbQpa.so.*.0和libQt5DBus.so.*.0库......"

#获取依赖库中第一个库完整的路径
libPath=$(echo $copyPathList | awk -F " " '{printf("%s\n"),$1}')
#获取Qt版本号
sonPath1=$(echo $libPath | awk -F "/lib" '{printf("%s\n"),$1}')
sonPath2=$(echo $sonPath1 | awk -F "/" '{printf("%s\n"),$NF}')
sonPath3=$(echo $sonPath1 | awk -F "/$sonPath2" '{printf("%s\n"),$1}')
QtVersion=$(echo $sonPath3 | awk -F "/" '{printf("%s\n"),$NF}')
echo "当前Qt版本号为:"$QtVersion


cd $currentPath

#打包Qt插件platforms文件夹
echo "---打包Qt插件platforms文件夹......"
#分解拼接插件platforms路径
platformsPath=$(echo $libPath | awk -F "/lib/" '{printf("%s\n"),$1}')"/plugins/platforms"
echo "---platformsPath路径:"$platformsPath
#将platforms文件拷贝到程序所在路径
cp -r $platformsPath $currentPath

#分解拼接指定库路径
Qt5XcbCopyPath=$(echo $libPath | awk -F "/lib/" '{printf("%s\n"),$1}')"/lib/libQt5XcbQpa.so.$QtVersion"
Qt5DBusCopyPath=$(echo $libPath | awk -F "/lib/" '{printf("%s\n"),$1}')"/lib/libQt5DBus.so.$QtVersion"

echo "Qt5XcbCopyPath:"$Qt5XcbCopyPath
echo "Qt5DBusCopyPath:"$Qt5DBusCopyPath

#拷贝libQt5XcbQpa.so.$QtVersion和libQt5DBus.so.$QtVersion库
cp $Qt5XcbCopyPath $packDes
cp $Qt5DBusCopyPath $packDes

#软链接
echo "------- 软链接正在打包libQt5XcbQpa.so.*和libQt5DBus.so.*  --------"
cd $packDes

Qt5XcblnPath=$(echo libQt5XcbQpa.so.*.0)
Qt5DBuslnPath=$(echo libQt5DBus.so.*.0)

libName1=$(echo $QtVersion | awk -F "." '{printf("%s\n"),$1}')
libName2=$(echo $QtVersion | awk -F "." '{printf("%s\n"),$2}')

ln -s $Qt5XcblnPath  $packDes/libQt5XcbQpa.so
ln -s $Qt5XcblnPath  $packDes/libQt5XcbQpa.so.$libName1
ln -s $Qt5XcblnPath  $packDes/libQt5XcbQpa.so.$libName1.$libName2

ln -s $Qt5DBuslnPath $packDes/libQt5DBus.so
ln -s $Qt5DBuslnPath $packDes/libQt5DBus.so.$libName1
ln -s $Qt5DBuslnPath $packDes/libQt5DBus.so.$libName1.$libName2

#打包自己的库所依赖的QT库
if [ ! -d "$myLibPath" ]; then
    echo "$myLibPath no exist"
    echo "-----------'$exe'所依赖的Qt库打包完成!-----------"
    exit 1 #没有依赖自己写的库,直接结束
fi


echo "------------正在获取自己写的库所依赖的QT库--------------"
for filePath in $myLibPath/*.so
do

	echo "myLib:"$filePath
	#赋值路径,准备拷贝	
	copyPathList=$(ldd $filePath | awk -F " " \
	'
	{
	    if ($3 ~ "/Qt")
	    { 
		printf("%s\n"),$3
	    }
	}
	')
	for file in $copyPathList
	do
	    name=$(echo $file | awk -F "/lib/" '{ print $2}')
	    if [ ! -f "$packDes/$name" ];then
		echo "copy file:"$file
		#拷贝‘Qt库’文件到打包文件夹路径中
		cp $file $packDes
	    fi		    	    
	done
done 

echo "-----------所依赖的Qt库全部打包完成!-----------"

到了这里,关于关于Qt程序打包后运行库依赖的常见问题分析及解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于GpuMall智算云—实例相关常见问题解答

    实例到期后有提醒吗?​ 有的,对于包月包周形式的产品,在用户使用期限到期前3天,系统会每天以短信形式给用户发送即将到期的提醒通知,对于包日形式的产品,系统会在到期前6h以短信形式给用户发送即将到期的提醒通知。 实例计费模式可以变更吗?​ 可以的,控制

    2024年01月22日
    浏览(29)
  • Windows环境下运行StableDiffusion常见问题

    目录 常见问题 一、问题1:22.2.2➡23.1.1 Torch is not able to use GPU 解决方案 二、问题2:exit code:128 CLIP did not run sucessfully 解决方案 三、问题3:exit code:128  open-clip did not run sucessfully 解决方案 四、问题4:exit code:128  gfpgan did not run sucessfully 解决方案 五、问题5:exit code:128  stable

    2024年02月06日
    浏览(33)
  • python pyinstaller打包常见问题(二):No file找不到文件解决办法

    我写了python程序,本地环境能正常运行,我打算打包成exe文件 方便发给朋友,让没有python环境也能正常运行 程序调用了wav文件,一个音效资源文件,程序调用的路径如下: 程序制作完成后,我开始打包 在需要打包的程序的目录上,我进入终端输入以下命令进行打包: 完成打

    2024年02月22日
    浏览(30)
  • 关于访问达梦数据库报错的常见问题

    【问题描述】 : 连接数据库时出现报错:登录服务器失败。 客户端管理工具连接数据库报错:错误号 6001,错误消息:网络通信异常。如下图所示: ​ 或命令行连接数据库报错:socket 连接失败或 Create SOCKET connection failure。如下图所示: ​ 【问题分析】 : 使用 DM 数据库时

    2024年02月05日
    浏览(103)
  • Vdbench:解决运行时出现的常见问题记录1

     一、Vdbench报错,如:Waiting for slave connection: localhost-5 1、运行vdbench遇到以下类似情况,一般为配置DNS问题 ​编辑         2、打开vi /etc/resolv.conf,将配置的DNS注释掉即可 注:远程ssh出现连接响应慢的问题,一般也是配置了DNS所导致的   ​

    2024年02月09日
    浏览(32)
  • SuperMap Hi-Fi 3D SDK for Unreal游戏引擎打包常见问题

    目录 前言 常见问题 1. UE打包报错:ERROR: No target name was specified on the command-line. 2. UE打包报错:ERROR: Expecting to find a type to be declared in a module rules named ‘XXX’ 3. UE打包报错:Error: System.ArgumentException: An item with the same key has already been added. Key: PakLoader

    2024年02月03日
    浏览(36)
  • 运行 `npm install` 时的常见问题与解决方案

    描述: 运行 npm install 时,可能会遇到网络连接问题,导致无法正常下载依赖包。 报错示例: npm ERR! network connection timed out npm ERR! connect ETIMEDOUT npm ERR! getaddrinfo EAI_AGAIN 解决方案: 确保你的计算机已连接到互联网。可以尝试打开浏览器,访问其他网页来确认网络连接正常。 检

    2024年02月07日
    浏览(52)
  • QT的mysql(数据库)最佳实践和常见问题解答

    涉及到数据库,首先安利一个软件Navicat Premium,用来查询数据库很方便  QMysql驱动是Qt SQL模块使用的插件,用于与MySQL数据库进行通信。要编译QMysql驱动,您需要满足以下条件: 您需要安装MySQL的客户端库和开发头文件,这些文件通常随MySQL的安装程序一起提供,或者可以从

    2024年02月12日
    浏览(46)
  • Qt 编译程序打包依赖库

    windows环境 使用windeployqt.exe 打包 linux环境 使用ldd命令打包

    2024年02月13日
    浏览(27)
  • SSL协议是什么?关于SSL和TLS的常见问题解答,被面试官问的网络安全问题难倒了

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包