【问题标题】:Building Qt application for mupltiple linux distributions为多个 linux 发行版构建 Qt 应用程序
【发布时间】:2013-09-10 11:59:07
【问题描述】:

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

  1. 运行qmake
  2. -Wl,-rpath,./附加到Makefile的LFLAGS指令,使依赖搜索也在当前目录中运行
  3. 运行 make
  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

有什么想法吗?

【问题讨论】:

  • 您可能尝试在比您尝试运行的新版本的 Linux/glibc/binutils 上进行编译。它从来没有真正运作良好。使其工作的最简单方法是安装旧的 Linux 版本(想想 2005 年)并在其上进行编译。顺便说一下,这个问题与 qt 或 g++ 或静态链接无关。这纯粹是一个 glibc/binutils 问题。
  • 碰巧是 ALT Linux 吗? :)

标签: linux qt g++ static-linking


【解决方案1】:

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

对于每个平台,如果可用且合适,请使用系统 Qt。比如在RHEL6/CentOS6上,系统Qt是4.6.2,所以你可能想链接自己在CentOS6上编译的Qt。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多