1

我正在使用 Qt 开发一个跨平台应用程序,该应用程序不得依赖于操作系统预安装的库。我对 Windows 没有任何问题:我需要做的就是将 .dll 文件复制到可执行文件目录中。对于各种基于 linux 的系统,我正在使用执行以下步骤的脚本:

  1. 运行qmake
  2. 附加-Wl,-rpath,./LFLAGSMakefile 的指令,使依赖搜索也在当前目录中运行
  3. 运行使
  4. 使用获取所有应用程序依赖项ldd -v -r并将可执行文件及其依赖项复制到另一个文件夹中

运行应用程序在构建应用程序的相同操作系统(和相同版本)的全新安装(没有 Qt)上运行良好,但在另一个操作系统/另一个版本上运行它由于一些错误而失败。

没有依赖关系的构建不是一个可行的选择,因为该应用程序可能在没有互联网访问和/或预安装 Qt 的机器上使用。而且我也不能使用静态构建,因为需要 QWebKit 并且它不支持静态构建。

我构建应用程序的系统和我尝试运行它的系统的不同组合会产生不同的错误:

relocation error: ./libcrypto.so.7: symbol __libc_enable_secure, version GLIBC_2.0 not defined in file ld-linux.so.2 with link time reference

relocation error: ./libc.so.6: symbol __libc_enable_secure, version GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference

有任何想法吗?

4

2 回答 2

2

我认为这是不可行的,只是将自己的库捆绑到所有内容中存在太多问题。商业供应商通常有一个明确支持的平台的简短列表(发行版 + 版本 + 架构组合)。

对于每个平台,如果可用且合适,请使用系统 Qt。例如,在 RHEL6/CentOS6 上,系统 Qt 是 4.6.2,因此您可能希望与自己在 CentOS6 上编译的 Qt 链接。

应该这样做的方式是建立持续集成系统,以便您在虚拟机中拥有目标分布,并且自动化脚本会编译并在所有这些上运行测试。这不必非常复杂,至少您需要在每个 VM 中运行一个 cron 脚本,通过电子邮件发送/上传结果,以及一个用于启动所有 VM 的配置/脚本。

于 2013-09-10T12:42:39.820 回答
0

在非常高的层次上,最好的方法是使用“胖二进制文件”的概念。本质上,您将(例如)一个 RHEL 6.5、一个 SUSE 10 和一个 Ubuntu 12 二进制文件捆绑到同一个文件中。然后,您可以构建一个非常简单的存根,它将查询 /etc/issue 并在运行时确定实际的主机分布并运行正确的二进制文件。多年前 NextStep 使用它在同一个“文件”中支持 x86 和摩托罗拉平台。如何做到这一点的确切细节我没有,但我敢打赌脚本语言。像 python 或 perl,甚至 bash 都可以处理存根部分。

于 2014-12-23T22:48:58.953 回答