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

标签 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 :

"The application bundle contains the application executable as well as dependencies such as the Qt libraries, plugins, translations and other resources you may need. Third party libraries like Qt are normally not installed system-wide; each application provides its own copy."

总结我的问题:

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

最佳答案

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

对于 Linux,这意味着:要为特定发行版创建包,请使用该发行版的打包系统。 (其中大多数都有很大帮助,因此您不必纠结于需要什么和不需要什么。)

针对“任何 Linux”的打包意味着:

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

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

抱歉,我不知道 MacOS 的要求。我的猜测是:有一些打包系统您可以简单地使用。

关于linux - 在 Mac OSX 和 Linux 上部署 Qt 应用程序,我需要在包中包含哪些库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025489/

相关文章:

macos - 创建 EC2 集群 : 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)

objective-c - Windows 或 Linux 上的 Objective C

linux - 汇编:如何将数字转换为ascii并写入显示缓冲区

iphone - 如何在 iOS 上找到 NSNetService 的正确端口?

c++ - Qt 小部件在某些情况下无法重新绘制

c++ - 在模板派生类中,为什么我需要在成员函数内使用 "this->"限定基类成员名称?

c++ - NVDA 屏幕阅读器请求错误的 QAccessible::InterfaceType

linux - 如何使用 sed 查找替换大于 100 的数字?

php - 由 PHP 命令脚本生成的后台脚本打印到屏幕

objective-c - AVCaptureOutput 通过 TPCircularBuffer 回调到音频单元