假设我们有一个共享库,它接受或返回某种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] 删除。
我来说两句