将程序链接到库,使用不同的_GLIBCXX_USE_CXX11_ABI

时间:2018-02-01 11:19:41

标签: c++ c++11 gcc abi

我正在尝试编译一个依赖于两个库的程序(使用GCC 5.4.O)。库A使用旧的ABI编译,而库B使用新的C ++ 11 ABI编译(参见Dual ABI)。

如果编译程序设置_GLIBCXX_USE_CXX11_ABI 1,我将链接错误与库A.如果我将其设置为0,我将链接错误与库B.

是否可以指示编译器使用_GLIBCXX_USE_CXX11_ABI的一个值编译对一个库的调用,并使用另一个_GLIBCXX_USE_CXX11_ABI值调用另一个库?

如果我理解正确,this is possible在编译一个依赖于另外两个库的新库时,我不知道程序是否也是如此。

1 个答案:

答案 0 :(得分:1)

是否可以指示编译器使用_GLIBCXX_USE_CXX11_ABI的一个值编译对一个库的调用,并使用_GLIBCXX_USE_CXX11_ABI的另一个值来编译对另一库的调用?

没有办法告诉编译器为您执行此操作。无论如何,这是行不通的,新旧的std::string类型是不兼容的,这就是拥有两个不同的ABI的全部意义所在。

您可以做的是手动确保对库A的所有调用都发生在用_GLIBCXX_USE_CXX11_ABI=0编译的代码中,对库B的所有调用都发生在用_GLIBCXX_USE_CXX11_ABI=1编译的代码中。这意味着您永远无法从单个源文件调用两个库。

您必须将库A的所有使用与库B的所有使用分开,并且不要在程序的这两部分之间传递std::string(或std::list)对象。