在Ubuntu上,gcc-multilib是什么意思?

在使用旧版Ubuntu(v.12)长时间之后,我正在更新到v.16,并对“gcc-multilib”的提及感到非常困惑。
这实际上是苹果的“fat二进制文件”或Linux中端口到“通用二进制文件”模型吗?
也就是说,Ubuntu上的本地C库是否变成了容器,打包了各种架构的几个二进制文件?
如果是这样,我们不再需要在x64系统上特别安装32位运行时库了吗? “默认”版本的gcc或g ++库包含运行和构建32位应用程序所需的所有内容吗?
2个回答

gcc-multilib 对于交叉编译非常有用,即编译一个程序以在不同的处理器架构上运行。例如,如果您正在运行64位Ubuntu并想要编译一个程序以在32位Ubuntu(或ARM等)上运行,则需要gcc-multilib


2所以,这与运行时库无关吗?我们是否仍然需要经过一系列繁琐的步骤来安装“libc-i386”,“g++-i386”等32位库以在x64上运行32位程序?而且,“dpkg --add-architecture i386”与多架构相关吗? - ddbug
是的。常规的步骤。dpkg --add-architecture只是告诉dpkg你真的想要安装外部架构的软件包,它应该停止抱怨并请求--force-architecture - AlexP
谢谢 AlexP。Ubuntu 16的多库设置是新的吗,还是之前就有了,比如14版甚至12版? - ddbug
至少在12.04。 - AlexP

这实际上是苹果的“fat binaries”或“universal binaries”模型移植到Linux吗?
不是。
Multilib是一种机制,用于在给定系统上支持构建和运行来自同一CPU系列的不同ABI的代码。最常见的用途是在64位系统上支持32位代码,在32位系统上支持64位代码,并且使用64位内核。它曾经被用于在硬浮点arm系统上提供对软浮点arm二进制文件的支持。
它已经存在很长时间了。至少从Debian lenny开始,但它在打包工具中从未有过特定的支持,这使得库的支持变得困难。此外,在arm上游将64位和32位架构视为完全独立的架构,而不是同一架构的变体,因此您无法在那里使用multilib。
就在Debian和Ubuntu系统上运行代码而言,multilib在很大程度上已被multiarch取代,后者是一种更通用的机制,允许在同一系统上安装来自可能任意组合的架构的软件包(尽管实际运行这些二进制文件可能需要安装仿真层)。
就建筑规范而言,Debian/Ubuntu现在提供了适当的交叉编译器软件包,比multilib更灵活,原则上允许您在任何平台上构建任何目标(尽管实际上Debian并未提供完整的组合)。
因此,我认为multilib在现阶段主要是遗留问题,但它仍然存在,因为重要的软件包仍然需要它来进行构建。