在Linux上部署一个兼容LSB的Qt应用程序二进制文件

5
我在Ubuntu 12.04上使用Qt Creator开发了一个小应用程序,希望能在任何其他Linux发行版(主要是不同版本的CentOS和Ubuntu)上运行,就像Windows上的任何便携式应用程序一样。
我希望能够简单地共享应用程序的二进制文件,并运行该应用程序。 我可以在Windows上成功地做到这一点,只需在QT Creator中构建项目,然后将所需的库放在应用程序目录中,然后将它们传输到其他Windows系统中即可。
我搜索了整个网络,发现我应该尝试使用LSB(Linux标准基础)兼容性来构建项目,以便在其他Linux发行版上运行。那么这是正确的做法吗?
由于我对Qt和Linux都很陌生(不太了解Shell脚本),因此我不知道该如何继续使应用程序符合LSB。
我参考了以下链接: 在Linux上分发基于Qt的二进制文件在Linux上部署Qt应用程序, 但是我无法理解我应该做什么。
我还发现这里的问题与我的情况非常相似,但由于我是个新手,我不知道该怎么做。
此外,考虑到前两篇文章是6年前写的,现在在Linux平台上部署Qt应用程序难道不应该有更简单的方法吗? 我还看到了一些关于静态链接的内容,这是正确的方法吗? 难道没有一种通过Qt Creator自身完成所有这些操作的方法吗?
如果无法创建适用于Linux的可移植Qt应用程序,是否有一种方法可以通过shell脚本或其他方式将编译Qt项目所需的所有步骤组合起来并在另一台计算机上运行它。例如,如果Qt-SDK不存在,则下载并运行qmake和make,然后编译新的应用程序(如果尚不存在),以便用户只需运行一个脚本即可运行程序。
3个回答

2
使二进制应用程序与任何其他Linux发行版兼容几乎是不可能的,因为您永远不会预先知道发行版X中可用的库或该库的哪个版本可用。即使在单个发行版(例如Ubuntu)中,二进制应用程序也几乎从不向后兼容,因为在Ubuntu 12.04上构建的任何内容都将依赖于安装在该版本Ubuntu上的版本库,并且尝试在Ubuntu 10.04上运行该二进制文件很可能会失败,因为它没有足够新的glibc或其他必要库的版本。
然而,如果将自己限制在有限的发行版列表和这些发行版的版本上,则可以更容易地实现这个想法。然后,您可以知道哪些库可用于这些发行版,并瞄准最低公共分母。我曾经维护过一个必须支持几个发行版(Ubuntu、Fedora、OpenSUSE、SLED、Mandriva)的二进制应用程序,我会在我的构建机器上安装我正在针对的最旧的发行版。这样,二进制应用程序将链接到这些发行版上可用的最旧版本的库。除非有这种库的新主要版本(这种情况相当少见,即使这样,发行版通常会为了兼容性目的而分发上一个主要版本),否则您编译的二进制文件将与所有目标发行版兼容。
因此,我为您的情况提供的快速建议是,在开发过程中使用仍受支持的最旧LTS版本的Ubuntu(目前为10.04),那么对于大多数最近流行的发行版,您应该是相当安全的。对于已经在Ubuntu 12.04上开发的应用程序,您应该没有问题,只需在10.04上重新编译相同的源代码即可。请理解,您永远无法以编译的C++ Qt应用程序实现100%的兼容性。
如果Qt对您不是很重要,则可以使用更高级别或解释性语言,例如Python、Java、Perl或Ruby。使用这些语言,您通常可以指望目标发行版已经安装了语言实现。

2
您的问题不在于Linux标准基础(LSB),而在于您需要的特定版本Qt的存在与否(或更高版本)。
就像在Windows机器上一样,用户可能已经安装了任何版本的Qt,或者根本没有安装。在Windows上检查特定版本的Qt的存在比在Linux上容易,因此编写自动化工具来简化体验更加容易。
要解决您的问题,有几种方法:
1. 告知用户您的程序需要特定版本的Qt或更高版本,并让用户处理问题。 2. 学习如何为您想要针对的每个发行版创建软件包并创建特定的软件包。 3. 使用类似0Install或Elf Statifier的程序创建包含所有必要库的软件包/可执行文件。
后者类似于许多Windows和Mac程序所做的(它们在安装程序中包含它们需要的每个库),但这不是Linux上首选的方式,Linux非常依赖共享库。

1

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