【问题标题】:How to compile binaries that work on older Linux distros?如何编译适用于旧版 Linux 发行版的二进制文件?
【发布时间】:2017-09-02 02:41:55
【问题描述】:

我有 Ubuntu 16.10。如何编译 C++ 程序,以便二进制文件在 Ubuntu 14.04 或任何其他类似年龄的 Linux 发行版上正常工作? (我只对 x86-64 感兴趣。)

这可以通过 16.10 (gcc 6.2) 上的默认编译器实现,还是我需要安装和使用与 14.04 相同的编译器 (gcc 4.8)?如果我需要旧版编译器,是否需要 -multilib 包?

我对兼容性所需的一般(与发行版无关)解释以及如何在我的 Ubuntu 版本上执行此操作的更具体提示感兴趣。

【问题讨论】:

  • 在我的情况下,我需要虚拟机来测试程序是否真的在目标发行版上运行,所以我只是在旧发行版上构建了可执行文件并继续测试,直到它们都构建了可执行文件并且都可以运行构建在其中任何一个之上的可执行文件。
  • @user4581301 在理想的世界中,我会这样做。但不幸的是,我在空闲时间这样做,仅使用个人资源,这些资源已经达到了极限。我已经有太多的虚拟机,所以我可以在三个主要的操作系统上构建。我让其他人在这些旧的 Linux 版本上进行测试。通过安装 gcc 4.8,我过去曾使用较旧的 Ubuntu(15.x?)进行此操作。不幸的是,我从那时起丢失了我的笔记......我还希望有一种方法可以不安装旧工具链。
  • 最重要的是,您将需要正在编译的库的适当旧版本,即这将出现在那些较旧的发行版本中。
  • @DanielJour 有没有办法将它们安装在较新的发行版上?由于可以针对完全不同的架构或 ABI(例如 ARM 或 x32)进行交叉编译,因此在我看来,也应该可以针对同一架构上的旧版本进行交叉编译。
  • @Szabolcs 嗯 ...您可以尝试在 chroot 中对所述旧发行版进行最小安装。这将引入旧库,应该可以从 chroot 中编译。 CPU“开销”比虚拟机少,但仍然(取决于发行版的“最小”程度)一些空间开销。

标签: c++ linux ubuntu gcc ubuntu-14.04


【解决方案1】:

丑陋的解决方案是静态链接所有内容(包括 c++ 运行时),以生成不那么依赖系统库的巨大的单体可执行文件(例如,他们在 go 语言中就是这样做的)。另一个丑陋的解决方案是设置一些 CI 并在所有受支持的系统上构建所有内容。然而,这很可能意味着在编写所有内容时都要考虑到最古老的受支持系统,并与兼容性问题作斗争。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2011-01-02
    • 1970-01-01
    • 2010-11-19
    • 2017-02-16
    相关资源
    最近更新 更多