5

我在 Ubuntu 12.04 上的 Qt Creator 中开发了一个小应用程序,我希望它应该在任何其他 linux 发行版(主要是不同版本的 CentOS 和 ubuntu)上运行,就像 Windows 上的任何便携式应用程序一样。

我希望能够简单地共享应用程序的二进制文件,并运行应用程序。我能够在 Windows 中成功地做到这一点,只需在 QT Creator 中构建项目,然后将所需的库放在 Application 目录中,然后将它们转移到其他 Windows 系统。

我到处搜索,发现我应该尝试使用 LSB(Linux 标准库)兼容性来构建项目,以便它可以在其他 linux 发行版上运行。这是正确的方法吗?

我对 Qt 和 Linux 都很陌生(不太了解 Shell 脚本)。因此,我不知道我应该如何继续使应用程序 LSB 兼容。

我参考了以下链接: 在 Linux 上分发基于 Qt 的二进制文件和在 Linux 上部署 Qt 应用程序,但我无法理解我应该做什么。

我也在这里发现了这个问题,它与我的情况非常相似,但是因为我是新手,所以我不知道该怎么做。

而且,考虑到前两篇文章是 6 年前写的,现在不应该有更简单的方法在 linux 平台上部署 Qt 应用吗?我还看到了一些关于静态链接的东西,这是要走的路吗?难道没有一种方法可以通过 Qt Creator 本身完成所有这些工作吗?

如果没有希望为 Linux 创建一个可移植的 Qt 应用程序,那么有没有办法,比如一个 shell 脚本或其他东西,可以结合在另一台计算机上编译 Qt 项目并运行它所需的所有步骤。比如说,如果没有 Qt-SDK,则下载 Qt-SDK,运行 qmake 和 make,然后如果还没有新编译的应用程序,那么用户只需运行一个脚本即可运行该程序。

4

3 回答 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。使用这些语言,您通常可以依靠目标发行版上已经安装的语言实现。

于 2012-07-05T23:37:23.983 回答
2

您的问题不是 Linux 标准基础,而是您需要的特定 Qt 版本(或更高版本)的存在与否。

就像在 Windows 机器上一样,用户可能安装了任何 Qt,或者他们可能根本没有安装。在 Windows 上,检查某个版本的 Qt 是否存在比在 Linux 上更容易,因此更容易编写自动化体验的安装工具。

要解决您的问题,有几种方法:

  1. 通知用户您的程序需要某个版本的Qt或更高版本,并让用户处理问题
  2. 了解如何为您想要定位的每个发行版创建包并创建特定包
  3. 使用 0Install 或 Elf Statifier 之类的程序来创建包含所有必要库的包/可执行文件。

后者类似于许多 Windows 和 Mac 程序所做的(它们在安装程序中包含他们需要的每个库),但它不是 Linux 上的首选方式,它严重依赖于共享库。

于 2012-07-06T05:13:39.123 回答
1

在 Linux 中部署应用程序是一场噩梦,幸运的是有一些解决方案。检查此项目以构建一个可移植的二进制文件,并捆绑了所有依赖项:

http://statifier.sourceforge.net/statifier/main.html

http://www.magicermine.com/index.html

http://www.pgbovine.net/cde.html

另一个解决方案是制作一个可移植的 0install 包:

http://0install.net/

我推荐这个解决方案。就我个人而言,我一直对 3 个第一个包装器有问题。

于 2012-07-05T19:24:11.840 回答