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



我正在尝试在Linux和mac中打包/部署一个Qt应用程序。(问题4.8)。由于许可类型的原因,我不得不使用共享库。

在Linux中,根据Qt文档,我运行了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-lib。但他们说,由于无法确定安装的程序将运行什么,我应该打包所有库依赖项。

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

我怎么知道需要哪些库?我应该把它们都打包吗?

mac的指示只显示我必须添加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文档:

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

总结我的问题:

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

程序链接到的所有库都是需要的。这就是许多Linux都有自己的打包系统的原因:该分发版的每个系统上都有库,所以你不必打包它们,它们知道如何管理依赖关系,所以你只提供dep和应用程序的列表。

对于Linux,这意味着:要为特定的发行版创建包,请使用发行版的打包系统。(它们中的大多数都有很大的帮助,所以你不必摆弄什么是需要的,什么是不需要的。)

"任何Linux"的打包意味着:

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

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

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

最新更新