如何为Linux制作Qt应用程序的二进制分发
我正在开发跨平台的Qt应用程序。 它是免费的,但不是开源的。因此,我想将其作为已编译的二进制文件分发 在windows上没有问题,我将编译的如何为Linux制作Qt应用程序的二进制分发,linux,qt,deployment,distribution,Linux,Qt,Deployment,Distribution,我正在开发跨平台的Qt应用程序。 它是免费的,但不是开源的。因此,我想将其作为已编译的二进制文件分发 在windows上没有问题,我将编译的exe与MinGW和Qt的DLL一起打包,一切都很顺利 但是在Linux上存在一个问题,因为用户可能在他/她的系统中拥有与我非常不同的共享库 Qt部署指南建议了两种方法:静态链接和使用共享库。 第一个生成巨大的可执行文件,还需要Qt依赖的许多库的静态版本,即,我必须从抓痕中重建所有库。第二种方法是在应用程序启动之前重新配置动态链接器,我觉得这有点棘手 任何人
exe
与MinGW和Qt的DLL一起打包,一切都很顺利
但是在Linux上存在一个问题,因为用户可能在他/她的系统中拥有与我非常不同的共享库
Qt部署指南建议了两种方法:静态链接和使用共享库。
第一个生成巨大的可执行文件,还需要Qt依赖的许多库的静态版本,即,我必须从抓痕中重建所有库。第二种方法是在应用程序启动之前重新配置动态链接器,我觉得这有点棘手
任何人都可以分享他/她在Linux下分发Qt应用程序的经验吗?我应该用什么方法?我可能会遇到什么问题?还有其他方法可以完成这项工作吗?您也可以在Linux上分发Qt共享库。然后,让您的软件加载这些,而不是系统默认的。使用
LD\u LIBRARY\u PATH
环境变量可以覆盖共享库。这可能是最简单的解决方案。您始终可以在可执行文件的包装器脚本中对此进行更改
或者,只需指定用户需要在系统上安装的最低库版本。不是这样的答案(sybreon对此进行了介绍),但请注意,如果二进制文件与Qt静态链接,则不允许您发布二进制文件,除非您购买了商业许可证,否则,您的整个二进制文件属于GPL(或者您违反了Qt的许可证)
如果你有商业执照,没关系
如果您没有商业许可证,您有两种选择:
当我们在Linux上发布Qt应用程序(或者任何使用共享库的应用程序)时,我们会发布一个目录树,其中包含实际的可执行文件和相关的包装器脚本,顶部带有子目录,其中包含共享库和您不想链接的任何其他必要资源 这样做的好处是,您可以让包装器脚本设置运行应用程序所需的所有内容,而无需担心用户设置环境变量、安装到特定位置等。如果操作正确,这还允许您不必担心从何处调用应用程序,因为它总是可以找到资源 实际上,我们进一步采用这种树结构,将所有可执行和共享库放在平台/体系结构子目录中,这样包装器脚本就可以确定本地体系结构,调用该平台的适当可执行文件,并设置环境变量以找到适当的共享库。我们发现,当为共享一个公共文件系统的多个不同linux版本分发时,此设置特别有用 尽管如此,如果可能的话,我们仍然喜欢静态构建,Qt应用也不例外。你完全可以静态地使用Qt进行构建,而不必像krbyrd在他的回答中指出的那样构建大量额外的依赖项。正是我所做的。您可以始终将库添加到LD\u LIBRARY\u PATH,也可以做一些更有趣的事情: 为每个目录设置一个附带的Qt库。编写一个shell脚本,让它在可执行文件上运行
ldd
,grep表示“未找到”,对于这些库中的每一个库,将适当的目录添加到列表中(我们称之为$ldd)。在您拥有了所有这些之后,运行二进制文件,并将LD_LIBRARY_PATH设置为它的上一个值加上$LDD
最后是关于“我将不得不从划痕中重建它们”的评论。不,你不必。如果您有这些库的开发包,那么您应该有
.a
文件,您可以静态链接这些文件。本文提供了有关此主题的信息。我会亲自尝试:
简言之:
- 使用-platform linux-lsb-g++配置Qt
- 应该进行链接 with–lsb使用默认链接器
- 打包所有内容并部署(将 这里需要一些调整,但我还没有尝试过(抱歉)
LD\u LIBRARY\u PATH
(这涉及使用启动程序外壳脚本等运行应用程序)使用-rpath
编译器标志构建二进制文件,并指向存储库的位置
例如,我将库存储在二进制文件旁边,或者存储在二进制文件旁边名为“mylib”的目录中。要在我的QMake文件中使用它,我在.pro
文件中添加了这一行:
QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/
我可以用本地库覆盖任何系统库来运行二进制文件,而不需要启动程序脚本。您可以查看QtCreator文件夹并将其用作示例。它在qtcreator/bin中有qt.conf和qtcreator.sh文件 lib/qtcreator是包含所有所需Qt*.so库的文件夹。qtcreator.sh中设置了相对路径,该路径应重命名为you-app-name.sh
导入,插件,qml在bin目录中。它们的路径在qt.conf文件中设置。这是部署QML应用程序所必需的。在Linux上创建Qt应用程序包最简单的方法可能是。它收集所有必需的文件,并允许您构建一个在大多数Linux发行版上运行的 确保您在最旧的仍然支持的基础上构建应用程序