如何在最新的Linux上运行一个程序,以便在旧的Linux上运行

时间:2018-05-04 11:51:20

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

我使用安装Arch Linux与Duel启动Linux Mint 18.1。在我的大学里我们安装了lubuntu 16.04和Ubuntu 14.04。我还在arch Linux中启用了测试repos,所以我得到了更新的软件包,因此当我在Arch上编译任何C ++程序时,由于共享库的版本不匹配而无法在Linux Mint上运行薄荷

就像libMango.so.64一样,而libMango.so.60也是如此。我怎么能克服这个?

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

我正在使用gcc 8.1。

1 个答案:

答案 0 :(得分:7)

  

如何使用较新的编译器和共享库编译任何C / C ++,以便与旧的共享库一起运行?

如果API(甚至是ABI,包括内部结构的大小和对齐方式,字段偏移量,vtables组织,那么

您无法可靠地 这些图书馆的变化不一致。

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

一些极少数的库会以二进制形式(例如在ABI级别)与其他版本的库兼容,从而做出真正的(并且有文档记录的)努力,但这并不常见。 Unixfree software传统是关心源级兼容性。 POSIX标准仅关注源兼容性。

您可以考虑使用某些chroot环境(请参阅chroot(2)path_resolution(7)& credentials(7)),将旧版发行版的重要部分放在较新的发行版上。详细信息是特定于分发的(在Debian和Ubuntu上,另请参阅schrootdebootstrap)。您还可以考虑在某个VM中运行完整分发,或使用Docker的容器。

您可能会尝试静态链接(本地)您的可执行文件,因此请编译并链接到g++ -static