在我看来,C 库几乎从来没有混合使用不同版本或(有时)甚至不同编译器编译的库的问题,而且许多语言似乎能够直接或以最小的努力与 C 库交互。
这都是因为 ABI 是标准的吗?
ABI 未编入语言标准。您可以获取任何 C 标准草案的副本以自己查看。
ABI 不在标准中是有充分理由的。无论如何,该标准无法预见可以实现 C 编译器的所有硬件和操作系统。
ABI 绝对不是标准的。至少,不在 C 标准中。每个操作系统或工具链都指定了这些内容,但语言本身没有。例如,尝试在 Linux 机器上运行 Windows 程序。
ABI 由操作系统和/或工具链定义,而不是由标准定义。例如,它定义了参数如何传递给函数调用。stackframe 具有什么布局或如何调用系统调用。
大多数语言能够与 C 库交互的原因很可能是因为大多数操作系统(或多或少)是用 C 编写的,将 C 库公开为 API 并基于此定义 ABI。如果用某种语言编写的库想要连接特定的操作系统,它必须能够连接该操作系统的 ABI。
ABI 不是 C 标准的一部分。但是,一直在努力使 ABI 标准化。引用“ Linux系统编程”:
尽管为跨多个操作系统的给定架构(特别是 Unix 系统上的 i386)定义单个 ABI 已经进行了多次尝试,但这些努力并没有取得多大成功。相反,操作系统(包括 Linux)倾向于定义它们自己认为合适的 ABI。