QT5如何打包到Ubuntu16

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/evil_119/article/details/80743301

最近一个跨平台的项目打包折腾的够呛,所以记录一波。

ldd 应用程序名

可以查看该应用程序名下面的所有依赖库,所以该命令很重要。网上有人利用该命令去导出所以依赖库,附代码如下:

#!/bin/sh

exe="./appname"
#发布的程序名
des="/home/myname/Qt5.9/"
#目标路径

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

看上去很完美,当程序依旧运行不了的时候,才发现人家的东西毕竟不是自己的,所以追本溯源才是重要的。根据程序报错来解决呗。

1.报错QT_5库no found:

进入开发机的qt安装目录如:/opt/qt5.9.4/5.9.4/gcc_64/(本人是64位系统),几个目录简要说明:

bin/    属于qt的一些运行文件如qmake,moc,designer等等

(附加说明一下,该目录下有一个qt.conf文件,该文件是用来指定程序路径结构的)

include/    包含了所有qt的头文件

doc/    帮助文档等

translation/    qtcreate支持的所有语言语种

mkspecs/    qt支持的所有编译器

phrasebooks/    qt常用语手册,多国语言

qml/    qml相关

lib/    所有qt程序依赖库

plugins/    所有qt插件

有平台相关,图片相关,多媒体,qml,sql,xcb等等。

拷贝lib目录下的程序依赖库到lib文件夹,到时候直接拷贝整个文件夹到目标机中即可。

根据错误提示,基本

cp -a libQt5Core.so* libQt5Widget.so* libQt5Gui.so* libQt5Netword.so* libQt5Svg.so* libQt5Sql.so* libQt5SerialPort.so* 目标路径/lib

为什么要用*结尾,目的是连软链接一起拷贝走,否则,系统还是用自带的qt库,所以我们需要libQt5Core.so.5这样的软链接被新版本覆盖掉,还有一种方式就是重命名所有的依赖库,linux下的动态库可是有一串的版本相关,这点上windows显得更精简。

最后将目标路径/lib拷贝到目标机的 /usr/lib/x86...(64位机),运行报错不一样了,说明依赖的qt库有作用了。

2.继续报错qt5,但库明显不一样了。

步骤同上:

cp -a libicui18n.so* libicuuc.so* libicudata.so* 目标路径/lib

这次报错不一样了

3.“xcb”平台相关xcb no found

xcb相关的东西是真多,好在系统已经自带了一部,我们只需拷贝qt相关的就好了

cp -a libQt5DBus.so* libQt5XcbQpa.so.5*目标路径/lib

cp -a plugins/platforms plugins/xcbglintegrations 目标路径/plugins(将qt的xcb插件拷贝到目标机,目标路径为运行文件所在路径)

此处花费时间最长,网上各种说法,真是五花八门。其实很简单就能解决的。linux就是很多这种看似很复杂实际很简单的操作,被人们用的太乱导致的。

此时程序终于可以爬起来了。但是

4.程序图标不显示

第一反应是images/目录没拷贝过来,是不是像win程序那样要加载资源,cp,然而一样,才醒悟过来,编译的时候就已经编译进去了。后面这点在开发机得以证实,是不需要images的。仔细查看运行中的程序发现是部分图片没显示,对比发现ico能显示正常,png显示不了,发现qt插件中还有个imageformats文件夹呢,一试,果然好了,此时程序基本ok了。

cp -a plugins/imageformats 目标路径/plugins (这里发现iconengines与sqldrivers等居然可以不要拷贝?嗯,后续遇到再拷贝过来吧。本程序是有用ico,sql的哦)

5.不能播放声音

呵,简单了,cp -a plugins/mediaservice playlistformats 目标路径/plugins

然而并没有用!!!baidu。果然没什么卵用。基本就是说gstreame/dsengine,后面才知道这两个一个是linux的开源多媒体引擎,一个是win平台的多媒体引擎。对比两平台的mediaservice插件,果然win是dsengine.dll. linux是libgst*.so.那就看看这些库依赖的库呗。目标机执行

ldd libgst*.so.    呵呵,no found libQt5MultiMedia 。。等等。统统cp一下。GAME START!完美!

补充:

    linux系统提供的共享库目录是/lib,/usr/lib (64位是/usr/lib/x86_64-linux-gun)。如何添加新的搜索目录?

    添加的搜索路径默认是放在/etc/ld.so.conf.d/ 目录下的所有文件中的,所以只需要在该目录下新建一个文件比如说opencv.conf,然后在该文件中加入.so文件的路径,比如/usr/local/lib 就可以了。切记,添加完后执行ldconfig使命令生效。

猜你喜欢

转载自blog.csdn.net/evil_119/article/details/80743301