将程序链接到库时,每个库都使用不同的_GLIBCXX_USE_CXX11_ABI

Linking a program to libraries the use different _GLIBCXX_USE_CXX11_ABI each

本文关键字:ABI GLIBCXX USE CXX11 链接 程序      更新时间:2023-10-16

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

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

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

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

是否可以指示编译器使用一个值 _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(对象。