就 ABI 兼容性而言,静态库的行为是否与动态库类似?

Fab*_*ian 4 c++ abi static-libraries

我了解到,您不能一起使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。当然例外的是如果你有一个纯C 接口,那么这是可能的。但是,我在这方面没有找到关于静态库的明确说明,因此提出这个问题。

我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期进行编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?

Joh*_*nck 6

可能会发生多种类型的不匹配,包括:

  1. 名字乱码。这是不同编译器可能不兼容的主要原因。然而,许多编译器是交叉兼容的。
  2. 调用约定。如何传递函数参数、返回值等。往往与CPU架构和操作系统相关。
  3. 语言类型。例如,int在不同的操作系统上可以具有不同的宽度。
  4. 库类型。通常std::stringstd::map每个库供应商可以以不同的方式实现其他类,并且由于许多人使用其编译器供应商提供的标准库,因此可能会出现此问题。

其中一些(例如名称修改)可能会导致构建失败。其他人可能看起来构建正常,但在运行时表现出意外。无论您使用静态链接还是动态链接,总体情况都是相同的。