是否可以使用不同 ABI 的外部库构建应用程序

is it possible to build an application with external libraries of different ABI's

我目前遇到的问题是我需要构建一个应用程序,其中的库似乎是使用不同的 C++ 版本构建的。 当我构建时,我在一个库中遇到 undefined reference std::__cxx11::basic_string 错误,当我使用 -D_GLIBCXX_USE_CXX11_ABI=0 构建时,我在另一个库的 std::string 中遇到未定义的引用错误。 它们都是外部库,不幸的是我无法重建自己。有解决办法吗?

您不能在单个文件中混合 GLIBCXX_USE_CXX11_ABI 的不同值,但您应该能够将 link 具有不同设置的文件放入单个库中。

因此,如果您在 class A 中使用 c++11 库,在 class B 和 [=29= 中使用 c++03 库] A 和 class B 在不同的文件中并且在他们的 headers 中没有 std::stringstd::list 那么应该可以link class A 和 class B 合并到一个库中。

可以使用 pimpl 模式 useful/required 来实现这一点。

最简单的方法可能是生成一个静态库,它包装您的 c++03 库并使用 -D_GLIBCXX_USE_CXX11_ABI=0 编译,然后您可以正常编译其余代码,只要您仅与你的 c++03 库通过静态库。

我能想到的唯一可能的解决方法不是很好。假设您的库 A 和 B 具有不同的 ABI 版本,vA 和 vB。现在,为库 A 创建一个包装器,它公开一个独立于 ABI 的接口(普通 C,即所有公开的函数都应该用 extern "C" 声明)。然后使用 ABI 版本 vA 构建它(确保静态 link 需要 vA 库)。现在您可以使用 ABI 版本 vB link 构建您的应用程序与包装库 A(现在应该是 ABI 独立的)和库 B.

当然,根据库A的界面,创建一个普通的C界面可能需要一些创意,但应该是可以的。

免责声明:我自己没有尝试过,我建议从最小测试开始。