我正在尝试编译一个依赖于两个库的程序(使用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在编译一个依赖于另外两个库的新库时,我不知道程序是否也是如此。
答案 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
)对象。