标准库ABI兼容性

Oier Lauzirika Zarrabeitia

假设我们有一个共享库,它接受或返回某种std类:

//lib.h
#include <vector>

std::vector<int> returnSomeInts();

//lib.cpp
#include "lib.cpp"

std::vector<int> returnSomeInts() {
   return {1, 3, 5};
}

因此,显然,在编译共享库时lib.so,必须针对特定版本的标准库编译此代码,例如,使用-std = c ++ 11。

现在,假设我们有一个将使用共享库的应用程序,但是它将针对更新的std库进行编译,例如-std = c ++ 2a

//app.cpp
#include <lib.h>

int main()
   auto v = returnSomeInts();

   //Process v
}

当标准库定义了内联类时,如果类成员的布局发生更改,则ABI兼容性将被破坏,因此上面的代码将无法正常工作。

我的问题是:当使用不同的c ++标准针对同一标头进行编译时,std库的通用实现是否可以保证ABI稳定性?以及针对不同的标头版本(例如libstdc ++-8和libstdc ++-9)进行编译时?

PD:上面的代码仅是示例,我并不是专门指 std::vector

无意义

实际上,ABI未链接到该标准,例如,请考虑以下代码这些代码使用gcc 4.9.4和gcc 5.1使用相同的标志进行编译

-std = c ++ 11 -O2

#include <string>
int main(){
    return sizeof (std::string);
}

gcc 4.9.4从main返回8,gcc 5.1返回32。

至于担保:很复杂:

标准没有任何保证。

实际上,MSVC曾经用来破坏ABI的兼容性,因此他们停止了(v140,v141,v142使用相同的ABI),clang / gcc长期以来都具有稳定的ABI。

对于那些有兴趣了解更多信息的人:对于与该问题没有直接关系的ABI / C ++标准的广泛讨论,请查看此博客文章。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

共享库:破坏ABI兼容性而不破坏API兼容性

来自分类Dev

共享库:在不破坏API兼容性的情况下打破ABI兼容性

来自分类Dev

COM 或 CORBA 是否带来了编译器或标准库的兼容性?

来自分类Dev

Raspberry Pi ARM Float ABI兼容性

来自分类Dev

发布和调试之间的ABI兼容性

来自分类Dev

Raspberry Pi ARM Float ABI兼容性

来自分类Dev

PyCUDA NPP库兼容性

来自分类Dev

ARC静态库兼容性

来自分类Dev

PyCUDA NPP库兼容性

来自分类Dev

还定义标准属性“ grid-row”以实现兼容性

来自分类Dev

C-非标准结构“兼容性”

来自分类Dev

未来笔记本内存升级兼容性标准

来自分类Dev

那么Android兼容性库不只是为了兼容性吗?

来自分类Dev

与automaticAdjustsScrollViewInsets的兼容性

来自分类Dev

包装兼容性

来自分类Dev

硬盘兼容性

来自分类Dev

游戏兼容性?

来自分类Dev

共享库与接口中的STL对象的GCC兼容性

来自分类Dev

Cloud Foundry与数据库的兼容性

来自分类Dev

不同的clp(FD)库实现的兼容性

来自分类Dev

ADO库参考和前向兼容性

来自分类Dev

C ++静态库和平台工具集兼容性

来自分类Dev

Jose4j库与Java 6的兼容性

来自分类Dev

PHP SOAP和Python SOAP库之间的兼容性

来自分类Dev

AppCompat / Support 26.1.0中的库与AndroidX之间的兼容性

来自分类Dev

MediaWiki版本之间的数据库兼容性

来自分类Dev

Angular 10库和IVY / ngcc兼容性

来自分类Dev

Cloud Foundry与数据库的兼容性

来自分类Dev

强制转换为兼容返回类型的并集是否满足函数指针的兼容性标准?