使用共享库在 Ubuntu 上部署 Qt 应用程序二进制文件

Posted

技术标签:

【中文标题】使用共享库在 Ubuntu 上部署 Qt 应用程序二进制文件【英文标题】:Deploy Qt Application binaries on Ubuntu with shared libs 【发布时间】:2015-03-10 20:55:24 【问题描述】:

我想部署一个我制作的 Qt 应用程序,以便在任何“Vanilla”Ubuntu 上运行。它可以是一个 .deb 包,或者只是带有所需库的二进制文件。问题是,我也不知道该怎么做。

我尝试按照本教程进行操作:https://lemirep.wordpress.com/2013/06/01/deploying-qt-applications-on-linux-and-windows-3/,实际上我设法使该应用程序在另一台计算机上运行,​​但是...它应该播放一些视频,我收到一条消息,例如:

defaultServiceProvider::requestService(): 找不到服务 - “org.qt-project.qt.mediaplayer”

我可能错过了一些库。但我真的不知道是哪些。当我在我的二进制文件上运行 ldd 时,一切似乎都正常。

ldd的结果如下:

libQt5MultimediaWidgets.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5MultimediaWidgets.so.5 (0x00007f02a0adf000)
libQt5Multimedia.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5Multimedia.so.5 (0x00007f02a07fc000)
libQt5Widgets.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5 (0x00007f029ffb9000)
libQt5Xml.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5Xml.so.5 (0x00007f029fd7b000)
libQt5Network.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5Network.so.5 (0x00007f029fa17000)
libQt5Gui.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5Gui.so.5 (0x00007f029f2f3000)
libQt5Core.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5Core.so.5 (0x00007f029ebbf000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f029e8a1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f029e68a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f029e2c4000)
libQt5OpenGL.so.5 => /home/mauker/Qt/5.3/gcc_64/lib/libQt5OpenGL.so.5 (0x00007f029e06a000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f029dd98000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f029da92000)
libpulse.so.0 => /usr/lib/x86_64-linux-gnu/libpulse.so.0 (0x00007f029d849000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f029d62a000)
libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f029d3d9000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f029d0d1000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f029cd9b000)
libicui18n.so.52 => /home/mauker/Qt/5.3/gcc_64/lib/libicui18n.so.52 (0x00007f029c97b000)
libicuuc.so.52 => /home/mauker/Qt/5.3/gcc_64/lib/libicuuc.so.52 (0x00007f029c5f2000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f029c3ee000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f029c1ec000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f029bfe3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f02a0cff000)
libjson-c.so.2 => /lib/x86_64-linux-gnu/libjson-c.so.2 (0x00007f029bdd8000)
libpulsecommon-4.0.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-4.0.so (0x00007f029bb70000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f029b92b000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f029b723000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f029b4e4000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f029b2c5000)
libicudata.so.52 => /home/mauker/Qt/5.3/gcc_64/lib/libicudata.so.52 (0x00007f0299a5a000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f029984f000)
libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007f02995e7000)
libasyncns.so.0 => /usr/lib/x86_64-linux-gnu/libasyncns.so.0 (0x00007f02993e0000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f02991dc000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f0298fd6000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f0298dbb000)
libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007f0298b8a000)
libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007f02986bb000)
libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007f029848d000)
libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007f0298284000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f0298069000)

我尝试将这些库中的每一个复制到一个名为“lib”的文件夹中,然后我制作了这个脚本来运行我的应用程序:

#!/bin/sh
export QTDIR=""
export QT_PLUGIN_PATH=""
export LD_LIBRARY_PATH=`pwd`/libs
export QT_QPA_PLATFORM_PLUGIN_PATH=`pwd`/libs/platforms
./App

我显然在这里遗漏了一些东西,但我不知道该去哪里找。你们能帮我解决这个问题吗?有没有更简单的方法在 Ubuntu 上部署我的程序?我应该尝试制作 .deb 包吗?如果是这样,我该如何为 Qt 应用程序执行此操作?

编辑:好的,我已经成功解决了将我的 QT_PLUGIN_PATH 设置为 pwd/lib 的第一个错误 - 但现在我收到了这条消息:

没有可用于类型“video/x-h264(...)”的解码器

这可以通过单独安装 ffmpeg 库来解决。但我真的很想以某种方式捆绑所有库,或者像我之前所说的那样,制作一个 .deb 包,为用户解决所有问题。

【问题讨论】:

【参考方案1】:

要解决您的编解码器问题,目标电脑需要安装相应的 gstreamer 库,然后是其依赖项 (ffmpeg),然后是 ffmpeg 依赖项,依此类推......

由于某些部门需要其他部门,您将结束捆绑大量库,因此您将陷入痛苦的世界。我建议你走 deb 打包路线,这样所有的依赖都会自动处理。

检查ubuntu packaging guide 或debian。您应该将您的 deb 打包问题拆分到另一篇文章中,以便获得更好的回复。

【讨论】:

感谢您的回复!好。我注意到这种方法不是最好的,但它是 Qt 网站上描述的方法:doc.qt.io/qt-5/linux-deployment.html 好吧,在我安装了 ffmpeg 和 gstreamer 之后,它就可以工作了。我将按照你的建议在这里询问ubuntu打包过程。我将您的答案标记为正确,因为它以一种方式解决了我的问题。再次感谢您的帮助!

以上是关于使用共享库在 Ubuntu 上部署 Qt 应用程序二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上部署 Qt 应用程序二进制文件,与 LSB 兼容

在 Ubuntu 9.10 上使用 Qt 编译共享库

如何在符合 LGPL 的 Linux 上部署 Qt5 应用程序? [关闭]

Linux 上的 Qt 5.8 (ubuntu 16.04) 应用程序部署

Qt程序部署到多平台,如何?

尝试使用共享库部署 Qt 应用程序时出错