如何为Linux制作Qt应用程序的二进制分发

18

我正在开发跨平台的Qt应用程序。

它是免费软件,但不是开源软件。因此,我希望将其作为编译后的二进制文件进行分发。

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

但是在Linux上会出现问题,因为用户的系统中可能有与我的非常不同的共享库。

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

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

8个回答

16

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

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

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

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


13

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

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


4
当我们在Linux上分发Qt应用程序(或者实际上使用共享库的任何应用程序)时,我们会发布一个目录树,该目录树包含顶部的实际可执行文件和相关包装脚本,以及包含共享库和其他必要资源的子目录,您不希望链接进去。
这样做的优点是,您可以让包装脚本设置运行应用程序所需的一切,而无需担心用户设置环境变量、安装到特定位置等等。如果做得正确,这还允许您不必担心从何处调用应用程序,因为它始终可以找到资源。
我们实际上通过将所有可执行文件和共享库放置在平台/架构子目录中,进一步扩展了这个目录结构,以便包装脚本可以确定本地架构并调用适合该平台的相应可执行文件,并设置环境变量以查找适当的共享库。我们发现,在分发多个共享一个通用文件系统的Linux版本时,这种设置特别有用。
尽管如此,我们仍然更喜欢在可能的情况下进行静态构建,Qt应用程序也不例外。您肯定可以静态构建Qt,并且不应该像krbyrd在他的回答中指出的那样需要构建许多附加依赖项。

4

sybreon的回答正是我所做的。你可以将你的库添加到LD_LIBRARY_PATH中,或者你可以做得更加高级一些:

将Qt的库文件每个放在一个目录下。编写一个shell脚本,在可执行文件上运行ldd并搜索“not found”,对于这些库文件,将相应的目录添加到列表$LDD中。当你拥有所有库文件后,使用LD_LIBRARY_PATH设置为其先前的值加上$LDD来运行二进制文件。

最后关于“我必须从头重新构建它们”的评论。不,你不需要这样做。如果你拥有这些库的dev包,你应该有.a文件,你可以静态链接它们。


3

这并不是一个答案(sybreon已经涉及到了),但请注意,如果您的二进制文件静态链接到Qt,除非您购买了商业许可证,否则您不允许分发您的二进制文件,否则您的整个二进制文件将属于GPL(或者您违反了Qt的许可证)。

如果您有商业许可证,那就没事了。

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

  1. 动态链接到Qt v4.5.0或更新版本(LGPL版本-您不能在除开源应用程序之外使用以前的版本),或者

  2. 公开您的源代码。


1
在Linux上创建Qt应用程序包的最简单方法可能是使用linuxdeployqt。它会收集所有所需文件并让您构建一个AppImage,该应用程序可以在大多数Linux发行版上运行。
请确保您在最旧但仍受支持的Ubuntu LTS版本上构建应用程序,以便您的AppImage可以列在AppImageHub上。

0

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

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

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


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接