就 ABI 兼容性而言,静态库是否表现得像动态库?
Do static libraries behave like dynamic libraries in terms of ABI compatibility?
我了解到您不能同时使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。例外当然是如果你有一个纯 C 接口,那么它是可能的。但是我没有找到关于静态库这方面的明确说法,所以才有这个问题。
我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?
可能会出现多种不匹配情况,包括:
- 名称修改。这是不同编译器可能不兼容的主要原因。然而,许多编译器是 cross-compatible.
- 调用约定。如何传递函数参数、return 值等。往往与 CPU 体系结构和操作系统相关联。
- 语言类型。例如
int
在不同的操作系统上可以有不同的宽度。
- 图书馆类型。通常
std::string
、std::map
和其他类可以由每个库供应商不同地实现,并且由于许多人使用他们的编译器供应商提供的标准库,所以可能会出现这个问题。
其中一些,如名称修改,可能会导致构建失败。其他人可能看起来构建正常,但在运行时表现出乎意料。无论您使用静态链接还是动态链接,总体情况都是一样的。
我了解到您不能同时使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。例外当然是如果你有一个纯 C 接口,那么它是可能的。但是我没有找到关于静态库这方面的明确说法,所以才有这个问题。
我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?
可能会出现多种不匹配情况,包括:
- 名称修改。这是不同编译器可能不兼容的主要原因。然而,许多编译器是 cross-compatible.
- 调用约定。如何传递函数参数、return 值等。往往与 CPU 体系结构和操作系统相关联。
- 语言类型。例如
int
在不同的操作系统上可以有不同的宽度。 - 图书馆类型。通常
std::string
、std::map
和其他类可以由每个库供应商不同地实现,并且由于许多人使用他们的编译器供应商提供的标准库,所以可能会出现这个问题。
其中一些,如名称修改,可能会导致构建失败。其他人可能看起来构建正常,但在运行时表现出乎意料。无论您使用静态链接还是动态链接,总体情况都是一样的。