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

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 -alibicui18n.so* libicuuc.so* libicudata.so* 目标路径/lib

这次报错不一样了

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

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

cp -alibQt5DBus.so*目标路径/lib

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

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

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

4.程序图标不显示

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

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

5.不能播放声音

呵,简单了,cp -aplugins/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使命令生效。

QT5如何打包到Ubuntu16的更多相关文章

  1. ios中的.dylib和.a lib有什么区别?

    我知道Objectivec中的编译和运行时是什么,但是我想知道是什么画了这两个库之间的界限?他们的目的是什么,除了陈述一个是静态的而另一个是动态的?我们何时需要一个而不是另一个?

  2. xamarin.ios – ShareKit与MonoTouch如何?

    有人可以验证ShareKit实际上是否可用于MonoTouch并指导我完成使其工作所需的步骤?解决方法您首先从getsharekit.com下载还是使用ShareKit2.0?

  3. ios – iPhone崩溃日志不能正确地符号化并且是双重间隔的

    任何建议超过欢迎.谢谢.解决方法当这件事发生在我身上时,它只是我通过电子邮件收到的日志.如果我记得,至少有一些是在.msg文件中,我不得不把它们拿出来.它可能是Exchange编码更改.如果你显示不可见的字符,你可能会看到每个字符之间的东西.您可以找到并替换它们以删除它们或更改编辑器中的编码.

  4. ios – Xcode 7 beta 2:LaunchScreen.storyboard无法打开文档

    我在两个不同的Mac(iMac和MacBookpro)上收到这个错误.不知道为什么人们不能再现它,但我需要一些帮助.在运行XX优胜美地10.10.4的Mac上运行Xcode7beta2(15六月’15).甚至无法编译和运行我的项目..我从创建菜单创建了一个视图应用程序项目,就是这样.编辑:我试图删除并重新添加storyboard文件(也可以打开Main.storyboard插件),我仍然得到相同的

  5. ios – 为具有多个目标和不同平台的项目编写Podfile

    如何让CocoaPods成功整合到我的项目和iOS/Mac目标?我已经阅读了Podfile文档,但发现它在这方面缺乏.解决方法得到它了!从我的每个目标和运行的pod安装中删除libPods-xxxx.a文件,再次执行了我的目标集成.

  6. ios – 在/usr/lib/system/libcache.dylib中,缺少必需的架构armv6

    在试图为iphoneos编写一个虚拟程序时,Xcode4,gcc似乎没有超出初始的sysroot目录如果我把sysroot,以下作品,但感觉非常干酪,而且不可伸缩.这里发生了什么?

  7. iOS中的CocoaPods是什么?

    任何人都可以详细说明iOS开发中的CocoaPods.我似乎无法理解它们是什么.提前致谢.解决方法CocoaPods是我在最近的iOS应用程序开发中发现的最好的东西之一.我用它来获取最新的Github开源项目作为框架和lib到我的项目中.最好的部分是它将自动管理依赖lib,因此无需拖放文件并下载文件夹blaablaaa只需一个简单的代码’podinstall即可!

  8. swift 值类型和引用类型

    1.Struct是值类型,拷贝是值拷贝,Class是引用类型,拷贝是引用拷贝

  9. 何时使用Swift Structs和Classes

    struct在绝大部分Objective-C代码中并不是很常用.我们偶尔以CGRect和CGPoint等方式接触到它们,但很少会自己去写.首先,它们不是很实用.用Objective-C在struct中正确地存储对象的引用的确很难,尤其是使用ARC的时候.很多其他语言干脆没有类似struct的东东.许多语言如同Python和JavaScript一样”万物皆对象”,只有引用类型.如果你是从这类语言转型到Swift的,你可能对struct的概念就更陌生了.等一下!

  10. Swift学习笔记(七)类和结构体

    储存属性是捆绑和储存在类或结构体中的常量或变量。定义了一个名为VideoMode的类创建类和结构体的实例属性访问注意:与Objective-C语言不同的是,Swift允许直接设置结构体属性的子属性。在Swift中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型,并且都是以结构体的形式在后台所实现。在Swift中,所有的结构体和枚举都是值类型。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部