【问题标题】:How to compile a program on bleeding edge linux to run on old linux如何在最前沿的 linux 上编译程序以在旧 linux 上运行
【发布时间】:2018-05-04 11:51:19
【问题描述】:

我使用双启动 Linux Mint 18.1 安装 Arch Linux。在我的大学里,我们安装了 lubuntu 16.04 和 Ubuntu 14.04。我还在 Arch Linux 中启用了测试存储库,所以我得到了更新的包,因此当我在 Arch 上编译任何 C++ 程序时,由于共享库的版本与 mint 中的不匹配,它不会在 Linux Mint 上运行。

就像 libMango.so.64 在拱门和 libMango.so.60 在薄荷。我该如何克服呢?

所以我问我如何使用较新的编译器和共享库编译任何 C/C++ 以在旧共享库中正常运行?就像我在 64 位机器上用 -m32 标志编译 32 位程序一样,旧共享库也有标志吗?

我使用的是 gcc 8.1。

【问题讨论】:

  • 为什么不能将源代码转移到大学并在大学计算机上编译?
  • @BasileStarynkevitch 想法不错,但我不能依赖大学才能找到工作。
  • 我不明白。您可以在家开发,并传输源代码。或者将您的源代码(假设它是免费软件)放在github 上并在多个地方进行开发。如果代码不是大学作业也不是免费软件,你可能不应该(并且可能不允许)在大学计算机上编译它(在大多数大学,你不能将他们的计算资源用于与你的大学教育无关的东西)
  • 即使是相对简单的库,交叉编译也很困难:stackoverflow.com/q/4032373/8120642
  • 您可以使用构建容器(例如 docker 在任何其他上)与您的同事使用的确切库版本,或者甚至在您和您同事的计算机上的同一个容器上运行您的项目(如果他赢了)不介意安装其他软件)

标签: c++ linux shared-libraries dynamic-linking archlinux


【解决方案1】:

如何使用较新的编译器和共享库编译任何 C/C++ 以在旧共享库中正常运行?

如果这些库的 API(甚至是 ABI,包括内部结构的大小和对齐方式、字段的偏移量、vtables 组织)发生更改,您将无法可靠地做到这一点不兼容。

一般来说,您最好在另一台计算机上重新编译您的源代码(如果该源与您的教育无关,您的大学可能会禁止这样做)。顺便说一句,如果您的源代码位于某个 git 存储库中(例如,github,如果它是开源的)在多台计算机上传输非常容易。

一些极少数库真正(和记录)努力以 二进制 形式(例如在 ABI 级别)与它们的其他版本兼容,但这并不常见。 Unixfree software 的传统是关心源代码级别的兼容性。而POSIX 标准只关心源兼容性。

您可能会考虑使用一些chroot-ed 环境(请参阅chroot(2)path_resolution(7)credentials(7))将旧发行版的基本部分放在新发行版上。详细信息是特定于发行版的(在 Debian 和 Ubuntu 上,另请参阅 schrootdebootstrap)。您还可以考虑在某些 VM 中运行完整的发行版,或者使用容器 à la Docker。

你可能会尝试静态链接(本地)你的可执行文件,所以编译并链接g++ -static

【讨论】:

  • (或使用 Ubuntu 14.04 设置虚拟机)
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
相关资源
最近更新 更多