在 Linux 上部署 Qt 应用程序二进制文件,与 LSB 兼容
Posted
技术标签:
【中文标题】在 Linux 上部署 Qt 应用程序二进制文件,与 LSB 兼容【英文标题】:Deploy a Qt Application Binary on Linux, compatible with LSB 【发布时间】:2012-07-05 13:04:16 【问题描述】:我在 Ubuntu 12.04 上的 Qt Creator 中开发了一个小应用程序,我希望它可以在任何其他 linux 发行版(主要是不同版本的 CentOS 和 ubuntu)上运行,就像 Windows 上的任何便携式应用程序一样。
我希望能够简单地共享应用程序的二进制文件,并运行应用程序。 我可以在 Windows 中成功地做到这一点,只需在 QT Creator 中构建项目,然后将所需的库放在 Application 目录中,然后将它们传输到其他 Windows 系统。
我搜索了一遍,发现我应该尝试使用 LSB(Linux 标准库)兼容性来构建项目,以便它可以在其他 linux 发行版上运行。这是正确的做法吗?
我对 Qt 和 Linux 都很陌生(不太了解 Shell 脚本)。 因此,我不知道应该如何使应用程序 LSB 兼容。
我参考了以下链接: Distributing Qt-based binaries on Linux 和 Deploying Qt applications on Linux 但我无法理解我应该做什么。
我也找到this question here,说的情况和我很相似,但是因为我是新手,不知道该怎么做。
此外,考虑到前两篇文章是 6 年前写的,现在不应该有更简单的方法在 linux 平台上部署 Qt 应用程序吗? 我还看到了一些关于静态链接的东西,这是要走的路吗? 难道这一切都可以通过 Qt Creator 本身来完成吗?
如果没有希望为 Linux 创建一个可移植的 Qt 应用程序,那么有没有办法,比如一个 shell 脚本或其他东西,可以结合在另一台计算机上编译 Qt 项目并运行它所需的所有步骤。比如说,如果没有 Qt-SDK,则下载 Qt-SDK,运行 qmake 和 make,如果还没有,则运行新编译的应用程序,这样用户只需运行一个脚本即可运行程序。
【问题讨论】:
【参考方案1】:您的问题不是 Linux 标准基础,而是您需要的特定 Qt 版本(或更高版本)是否存在。
就像在 Windows 机器上一样,用户可能安装了任何 Qt,也可能根本没有安装。在 Windows 上,检查某个版本的 Qt 是否存在比在 Linux 上更容易,因此更容易编写自动化体验的安装工具。
解决您的问题有几种方法:
-
告知用户您的程序需要特定版本的 Qt 或更高版本,并让用户处理问题
了解如何为您要定位的每个发行版创建软件包并创建特定软件包
使用 0Install 或 Elf Statifier 之类的程序来创建包含所有必要库的包/可执行文件。
后者类似于许多 Windows 和 Mac 程序所做的(它们在安装程序中包含他们需要的每个库),但它不是 Linux 上的首选方式,它严重依赖于共享库。
【讨论】:
【参考方案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。使用此类语言,您通常可以依赖已安装在目标发行版上的语言实现。
【讨论】:
【参考方案3】:在 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 个包装商一直有问题。
【讨论】:
以上是关于在 Linux 上部署 Qt 应用程序二进制文件,与 LSB 兼容的主要内容,如果未能解决你的问题,请参考以下文章
使用共享库在 Ubuntu 上部署 Qt 应用程序二进制文件
使用静态 Qt 构建在 Linux 上部署 Qt5 应用程序