在Mac OSX和Linux上部署Qt应用程序,我需要在包中包含哪些库?

时间:2014-09-24 20:02:02

标签: linux macos qt deployment shared-libraries

我正在尝试在Linux和Mac中打包/部署Qt应用程序。 (Qt 4.8)。由于许可类型,我必须使用共享库。

在Linux中,在Qt documentation之后,我运行了ldd myprogram并获得了类似

的输出
linux-gate.so.1 =>  (0xb76fa000)
libOneOfMyLibs.so.1 => /usr/local/lib/libOneOfMyLibs.so.1 (0xb76d7000)
libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb5440000)
libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb501a000)
.......
libgpg-error.so.0 => /lib/i386-linux-gnu/libgpg-error.so.0 (0xb4316000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb4fba000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb4f9c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb4df0000)
libcups.so.2 => /usr/lib/i386-linux-gnu/libcups.so.2 (0xb4d91000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb4cbb000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb4cb6000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb4c99000)
libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb4c56000)
libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb4c3c000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb4b41000)
libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb4b14000)
libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb4a67000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb4a16000)
.....

很多依赖项,其中只有一些是Qt库。但他们说,由于无法确定安装的程序将运行什么,我应该打包所有库依赖项。

有太多!!!我肯定要求其中一些像sqlite3。我还读到libfreetype和libfontconfig是必需的,因为它们在新系统上可能不同。

我怎么知道哪些库是必需的?我应该打包所有这些吗?

mac directions 仅显示我必须添加Qt库。即使在mac上列出依赖关系,我也会得到

myprogram.app/Contents/MacOS/myprogram:
    libOneOfMyLibs.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/local/lib/libsqlite3.0.dylib (compatibility version 9.0.0, current version 9.6.0)
    /usr/lib/libcups.2.dylib (compatibility version 2.0.0, current version 2.8.0)
    QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.6)
    QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.6)
    ....
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 832.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

在mac上 - 我需要添加libstdc ++。6.dylib和其余的吗?

来自Qt documentation

  

“应用程序包包含应用程序可执行文件以及   依赖关系,如Qt库,插件,翻译等   您可能需要的资源。像Qt这样的第三方库通常不是   全系统安装;每个应用程序都提供自己的副本。“

总结我的问题:

如果我不想对我想要部署的系统做任何假设,我是否需要添加所有系统库依赖项,或者只需要添加Qt库,或者......我必须添加的库到我的包裹?

1 个答案:

答案 0 :(得分:0)

您的程序链接到的所有库都需要以某种方式。这就是许多Linux拥有自己的打包系统的原因:有一些lib驻留在该发行版的每个系统上 - 所以你不必打包它们 - 他们知道如何管理依赖 - 所以你只提供一个deps列表和你的应用

关于Linux,这意味着:要为特定分发创建包,请使用分发包装系统。 (他们中的大多数都有很大的帮助,所以你不必为需要和不需要的东西弄乱。)

“任何Linux”的包装意味着:

  • 包含所有依赖项
  • 编写一个不得覆盖现有文件的安装程序

为“所有”发行版提供包的最简单方法:使用众所周知的构建系统(如Autotools或CMake)分发源代码,告诉用户代码中使用了哪些外部库,以便他/她可以安装在尝试构建应用程序之前的那些。

对不起,我不了解MacOS的要求。我的猜测是:你可以简单地使用一些包装系统。