我正在开发跨平台的Qt应用程序。 虽然不是开源的,但它是免费软件。因此,我想将其作为已编译的二进制文件进行分发。
在Windows上没有问题,我将编译好的exe
与MinGW和Qt的DLL打包在一起,一切都很顺利。
但是在Linux上存在一个问题,因为用户可能在他/她的系统中拥有与我的完全不同的共享库。
Qt部署指南提出了两种方法:静态链接和使用共享库。 第一个产生巨大的可执行文件,并且还需要Qt所依赖的许多库的静态版本,即我将不得不从划痕中重建所有这些库。第二种方法是基于在应用程序启动之前重新配置动态链接器,对我来说似乎有点棘手。
任何人都可以分享他/她在Linux下分发Qt应用程序的经验吗?我应该使用什么方法?我可能遇到什么问题?还有其他方法可以完成这项工作吗?
答案 0 :(得分:15)
共享库是可行的方法,但您可以避免使用LD_LIBRARY_PATH
(包括使用启动程序shell脚本运行应用程序等)使用-rpath
编译器标志构建二进制文件,指向在那里你存储你的图书馆。
例如,我将库存储在二进制文件旁边或我二进制文件旁边名为“mylib”的目录中。要在我的QMake文件中使用它,我在.pro
文件中添加以下行:
QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/
我可以使用我的本地库来运行我的二进制文件,覆盖任何系统库,而不需要启动器脚本。
答案 1 :(得分:12)
您还可以在Linux上分发Qt共享库。然后,让您的软件加载那些而不是系统默认的软件。可以使用LD_LIBRARY_PATH
环境变量覆盖共享库。这可能是最简单的解决方案。您始终可以在可执行文件的包装脚本中更改此内容。
或者,只需指定用户需要在系统上安装的最低库版本。
答案 2 :(得分:4)
当我们在Linux(或任何使用共享库的应用程序)上分发Qt应用程序时,我们提供了一个目录树,其中包含顶部的实际可执行文件和相关的包装器脚本,以及包含共享库和任何其他必要资源的子目录你不想链接。
这样做的好处是,您可以让包装器脚本设置运行应用程序所需的一切,而不必担心用户设置环境变量,安装到特定位置等。如果正确完成,这也是允许您不必担心调用应用程序的位置,因为它始终可以找到资源。
我们实际上通过将所有可执行文件和共享库放在平台/体系结构子目录中来进一步采用这种树结构,以便包装器脚本可以确定本地体系结构并为该平台调用适当的可执行文件并将环境变量设置为找到合适的共享库。我们发现这种设置在分发共享公共文件系统的多个不同Linux版本时特别有用。
所有这一切,我们仍然宁愿在可能的情况下静态构建,Qt应用程序也不例外。你肯定可以静态地用Qt构建,你不应该像krbyrd在他的回复中所说的那样构建很多额外的依赖。
答案 3 :(得分:3)
不是这样的答案(sybreon涵盖了这一点),但请注意,如果您的二进制文件与Qt静态链接,则不允许分发您的二进制文件,除非您已购买商业许可证,否则你的整个二进制文件属于GPL(或者你违反了Qt的许可证。)
如果您持有商业许可证,请不要介意。
如果您没有商业许可证,您有两种选择:
动态链接Qt v4.5.0或更新版本(LGPL版本 - 除开源应用程序外,您可能不会使用以前的版本)或
打开源代码。
答案 4 :(得分:3)
sybreon's answer正是我所做的。您可以随时将库添加到 LD_LIBRARY_PATH ,也可以做一些更有趣的事情:
为每个目录设置一个装运的Qt库。编写一个shell脚本,让它在可执行文件上运行ldd
,为'not found'运行grep,对于每个库,将相应的目录添加到列表中(让我们称之为$ LDD)。完成所有操作后,运行二进制文件,并将 LD_LIBRARY_PATH 设置为之前的值加上$ LDD。
最后评论“我将不得不从划痕中重建所有这些”。不,你不必。如果您拥有这些库的开发包,则应该有.a
个文件,您可以静态链接这些文件。
答案 5 :(得分:1)
在Linux上创建Qt应用程序包的最简单方法可能是linuxdeployqt。它收集所有必需的文件,并允许您构建在大多数Linux发行版上运行的AppImage。
确保在最旧的仍支持的Ubuntu LTS版本上构建应用程序,以便可以在AppImageHub上列出您的AppImage。
答案 6 :(得分:0)
您可以查看QtCreator文件夹并将其用作示例。它在 QtCreator / bin 中有 qt.conf 和 qtcreator.sh 文件。
lib / qtcreator 是包含所有所需Qt * .so库的文件夹。相对路径在qtcreator.sh中设置,应该重命名为 you-app-name.sh
导入,插件, qml 位于 bin 目录中。它们的路径在 qt.conf 文件中设置。这是 QML 应用程序部署所必需的。
答案 7 :(得分:-1)
本文包含有关该主题的信息。我会自己尝试一下: http://labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/
用几句话说: