小编sas*_*res的帖子

为什么库API +编译器ABI足以确保具有不同版本gcc的对象之间的兼容性?

我遇到过一种情况,我可能想要使用一个版本的gcc编译的C++共享对象库,其中一些代码将使用另一个版本的gcc编译.特别是,我想使用返回一些STL容器的方法,如std::stringstd::map.

GCC网站和许多老计算器职位(如这里)讨论这个问题.我目前的理解是

  • 此问题的大多数问题和大多数帖子都是关于.so文件和.dll文件之间的交叉兼容性.由于编译器ABI不同,这非常困难.

  • 对于使用不同版本的gcc(至少使用gcc版本> = 3.4)编译的.so文件之间的交叉兼容性,您需要确保的是标准库API没有更改(如果有,则有双重ABI支持).

我的问题与它在机器级别的工作方式有关.看起来有可能gcc可以更改标头实现std::string,即使库API没有改变,以使其更有效或出于其他原因.如果是这样,则使用两个不同的std::string头编译两个不同的代码片段,并且基本上定义具有相同名称的两个不同的类.我们如何能够保证,当我们将std::string使用一个头的代码传递给使用另一个头的代码时,该对象不会以某种方式被破坏或误读?

例如,假设我有以下文件:

// File a.h:

#ifndef FILE_A
#define FILE_A

#include <string>

class X {
  public:
    std::string f();
};

#endif  // FILE_A


// File a.cpp:

#include "a.h"

std::string X::f() {
  return "hello world";
}


// File b.cpp:

#include <iostream>
#include <string>
#include "a.h"

int main() {
  std::string x = X().f();
  std::cout << x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

(这个类的唯一目的X是在我测试它是如何工作的时候在共享对象库中引入更多名称修改.) …

c++ gcc stl abi

6
推荐指数
2
解决办法
403
查看次数

标签 统计

abi ×1

c++ ×1

gcc ×1

stl ×1