目录
1.发觉的问题:
明天发觉,linux的编译好的qt程序发布移植,相比windows下的发布移植,多了一些步骤
window下直接用qt携带的windeployqt打包工具,在你要打包的应用程序目录下用命令执行:windeployqt+你要发布的应用程序名arch linux,如windployqtgame.exe
然而linux下的发布,就没有这么简单了,起码我的是这样子的。由于linux下的qt没有自带的打包工具。你也可以去下载,有前辈写好了,去下安装就行了。不过安装好以后,后续的步骤也蛮麻烦的,我就不用这些技巧了。
我直接用linux下的命令打包吧。接出来步入题外话:
2.如何办?linux下的打包发布步骤如下:
先说一下我开发所在的笔记本:我如今编译应用程序的环境是:ubantu18.04版本的,开发环境:Qt5.12.0编译环境:gcc_64
要移植的笔记本:ubantu16.04版本没有开发环境
第一步:打包依赖库
我的编译好的发布目录下没有其他库,只有一个可执行的应用程序,可以执行,由于我有qt的开发环境linux系统移植步骤,他会手动找寻链接所要的库,而且没有qt环境的笔记本就不能运行。所以我们要把它运行时所依赖的库全部给他弄到发挎包起来,看下一步
在发布目录下新建一个脚本
内容如下:
#!/usr/bin/sh
exe="UpdateClient" #程序名称
des="/home/yicaibao/Qt5.12.0/qtProject/UpdateClient/bin/fabu-release" #打包文件夹位置
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
注意一下:改一下程序名称和你要打包的文件位置,按照你的来
之后在脚本文件所在的文件目录下,命令行执行脚本:shpack.sh
步入打包的文件夹下,会发觉有好多库,这种就是要依赖的库,那这样就完了吗?还不行,还有一些库须要拿进来。
第一个库:步入在qt安装位置下编译环境的plugins目录下
之后把plugins目录下的platforms目录复制到要打包的目录下
执行命令:cp-rplatforms//home/yicaibao/Qt5.12.0/qtProject/UpdateClient/bin/fabu-release
这是一个目录,不要把目录上面的文件掏出来,放进刚才打包好的库一起,是不行的
还有两个库:libQt5XcbQpa.so.5.12.0和libQt5DBus.so.5.12.0
在qt安装编译环境目录的lib目录下
把这两个库复制到打包发布目录下
将可执行程序也复制到该目录下
大功告成!
将其打包好,接出来就可以移植到其他笔记本上了
第二步:移植到其它笔记本,并做好配置
将压缩包拷贝到,要移植的笔记本上,解压
我们步入解压目录,直接运行,在命令行运行,发觉报错,提示找不到依赖库
而且认真看一下,我们不是打包过来了吗?那些缺乏的库,为何还报错呢?
由于在程序运行时,它默认寻觅的库是在系统lib目录下,并不在发布的文件夹下,报错信息中就可以晓得
怎样办呢?
我们改一下库依赖路径就行了
在命令行写输入:
exportLD_LIBRARY_PATH='你的库路径':$LD_LIBRARY_PATH
export LD_LIBRARY_PATH='/home/valwell/tmp/fabu-release':$LD_LIBRARY_PATH
再度运行,还是报错了
报错信息不是很明晰,并且按照提示肯定是少插件了,具体不晓得是哪些
在命令下执行:exportQT_DEBUG_PLUGINS=1
这个命令可以帮我们输出程序运行时,加载插件时的调试信息
执行命令后,再度执行,发觉提示RED HAT LINUX 9.0,少了libQt5XcbQpa.so.5的库,并且我们把Qt这边的库打包了libQt5XcbQpa.so.5.12.0的库,而且他要的是.so.5后缀的库,怎样办呢?
我们软链接过来就行了,命令行执行:ln-slibQt5XcbQpa.so.5.12.0libQt5XcbQpa.so.5
再度执行程序linux系统移植步骤,发觉此次libQt5DBus.so.5的库找不到,而且qt打包时我们有拿过来了,只是名子不同,我们进行软链接即可,执行命令:ln-slibQt5DBus.so.5.12.0libQt5DBus.so.5
之后再度执行,发觉可以运行啦
上述的命令汇总为如下脚本命令
#!/usr/bin/sh
export QT_DEBUG_PLUGINS=1
export LD_LIBRARY_PATH='/home/valwell/tmp/fabu-release':$LD_LIBRARY_PATH
ln -s libQt5XcbQpa.so.5.12.0 libQt5XcbQpa.so.5
ln -s libQt5DBus.so.5.12.0 libQt5DBus.so.5
./UpdateClient
由于使用export导出的是临时的,所以只是局限于当前命令窗口,关掉后就失效了,写上述的脚本后,上次直接运行脚本就行了。大家在调试运行时,可能少的不止libQt5XcbQpa.so.5和libQt5XcbQpa.so.5这两个库,这时就须要依照这个思路进行找寻问题的症结了。少啥补啥就行了。通常少的东西,在开发环境的机子上肯定有!!!
总结:
为何写这么多呢?虽然这是个思路过程吧,linux下好多时侯库是链接不上的,这时侯就须要我们思索了,在发布移植时,由于可能另一台笔记本没有开发环境,就须要我们的配置了。如同一个开发团队,接了一个外包,她们已然分工开发好了,在她们的笔记本运行流程。并且,给顾客时,由于顾客是没有开发环境的,总不能给顾客安装个开发环境吧?这是不现实的,所以须要在交付给顾客前,要在另一台没有开发环境的机器或则虚拟机上调试,直至运行没有问题。
好了,上班上班!!
2022-2-24更新补充:嫌弃里面的打包太麻烦了,还可能出现好多雷区,来看这个我最新写的文章,能够防止各类雷,脚本一键式打包
关于Qt程序打包后运行库依赖的常见问题剖析及解决方式_只是个~小不点的博客-CSDN博客