16

我正在开发跨平台的 Qt 应用程序。它是免费软件,虽然不是开源的。因此,我想将它作为已编译的二进制文件分发。

在 Windows 上没有问题,我将编译exe后的文件与 MinGW 和 Qt 的 DLL 一起打包,一切顺利。

但是在 Linux 上存在一个问题,因为用户可能在他/她的系统中拥有与我非常不同的共享库。

Qt 部署指南建议两种方法:静态链接和使用共享库。第一个产生巨大的可执行文件,还需要Qt依赖的许多库的静态版本,即我必须从头开始重建它们。第二种方法基于在应用程序启动之前重新配置动态链接器,对我来说似乎有点棘手。

谁能分享他/她在 Linux 下分发 Qt 应用程序的经验?我应该使用什么方法?我可能会遇到什么问题?还有其他方法可以完成这项工作吗?

4

8 回答 8

15

共享库是要走的路,但您可以避免使用LD_LIBRARY_PATH(这涉及使用启动器 shell 脚本运行应用程序等)使用-rpath编译器标志构建二进制文件,指向您存储库的位置。

例如,我将我的库存储在我的二进制文件旁边或在我的二进制文件旁边名为“mylib”的目录中。要在我的 QMake 文件中使用它,我在文件中添加了这一行.pro

QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/

而且我可以使用覆盖任何系统库的本地库来运行我的二进制文件,而无需启动器脚本。

于 2012-11-20T17:34:52.800 回答
13

您还可以在 Linux 上分发 Qt 共享库。然后,让您的软件加载那些而不是系统默认的。可以使用LD_LIBRARY_PATH环境变量覆盖共享库。这可能是您最简单的解决方案。您始终可以在可执行文件的包装脚本中更改它。

或者,只需指定您的用户需要在系统上安装的最低库版本。

于 2009-06-01T14:08:40.823 回答
4

当我们在 Linux 上分发 Qt 应用程序(或者实际上是任何使用共享库的应用程序)时,我们会发布一个目录树,其中包含实际的可执行文件和相关的包装脚本在顶部,子目录包含共享库和您不需要的任何其他必要资源不想链接。

这样做的好处是您可以让包装脚本设置运行应用程序所需的一切,而不必担心让用户设置环境变量、安装到特定位置等。如果操作正确,这还允许您不必担心从哪里调用应用程序,因为它总能找到资源。

实际上,我们通过将所有可执行文件和共享库放在平台/架构子目录中来进一步采用这种树结构,以便包装脚本可以确定本地架构并为该平台调用适当的可执行文件并设置环境变量以找到合适的共享库。我们发现此设置在为共享公共文件系统的多个不同 linux 版本分发时特别有用。

尽管如此,我们仍然更喜欢尽可能静态构建,Qt 应用程序也不例外。您绝对可以使用 Qt 静态构建,并且您不必像 krbyrd 在他的回复中指出的那样构建很多额外的依赖项。

于 2009-06-01T14:42:49.927 回答
4

sybreon 的回答正是我所做的。你可以总是将你的库添加到LD_LIBRARY_PATH或者你可以做一些更花哨的事情:

为每个目录设置一个已发布的 Qt 库。编写一个 shell 脚本,让它ldd在可执行文件上运行并 grep 查找“未找到”,对于每个库,将适当的目录添加到列表中(我们称之为 $LDD)。全部完成后,运行二进制文件并将LD_LIBRARY_PATH设置为之前的值加上 $LDD。

最后是关于“我将不得不从头开始重建所有这些”的评论。不,你不必这样做。如果你有这些库的开发包,你应该有.a文件,你可以静态链接这些。

于 2009-06-01T14:43:16.620 回答
3

不是这样的答案(sybreon 涵盖了那个),但请注意,如果您的二进制文件与 Qt 静态链接,则不允许您分发它,除非您购买了商业许可证,否则您的整个二进制文件属于 GPL(或者您'违反了 Qt 的许可。)

如果您有商业许可证,请不要介意。

如果您没有商业许可证,您有两种选择:

  1. 与 Qt v4.5.0 或更高版本(LGPL 版本 - 除了在开源应用程序中,您不得使用以前的版本)动态链接,或

  2. 打开你的源代码。

于 2009-06-01T14:42:25.763 回答
1

在 Linux 上创建 Qt 应用程序包的最简单的方法可能是linuxdeployqt。它收集所有必需的文件,并允许您构建在大多数 Linux 发行版上运行的AppImage 。

确保您在仍受支持的最旧 Ubuntu LTS 版本上构建应用程序,以便您的 AppImage 可以在AppImageHub上列出。

于 2018-02-04T11:03:05.567 回答
0

您可以查看 QtCreator 文件夹并将其用作示例。它在QtCreator/bin中有qt.confqtcreator.sh文件。

lib/qtcreator是包含所有需要的 Qt *.so 库的文件夹。相对路径是在qtcreator.sh里面设置的,应该重命名为you-app-name.sh

importspluginsqml都在bin目录中。它们的路径在qt.conf文件中设置。这是QML应用程序部署所必需的。

于 2017-02-20T09:41:34.273 回答
-1

本文包含有关该主题的信息。我自己试试:http: //labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/

简单来说:

  • 使用 -platform linux-lsb-g++ 配置 Qt
  • 链接应该使用 –lsb-use-default-linker
  • 打包所有东西并部署(这里需要一些调整,但我还没有尝试过)
于 2009-06-03T18:03:09.143 回答