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

时间:2019-09-11 14:51:54

标签: c++ linker-errors abi

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

2 个答案:

答案 0 :(得分:1)

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

当然,根据库A的界面,创建简单的C界面可能需要一些创造力,但应该可以。

免责声明:我自己还没有尝试过,我建议从最低限度的测试开始。

答案 1 :(得分:0)

您不能在一个文件中混合使用GLIBCXX_USE_CXX11_ABI的不同值,但是应该可以将具有不同设置的文件链接到一个库中。

因此,如果您使用类A中的c ++ 11库和类B中的c ++ 03库以及类A和类B在单独的文件中并且标头中没有std::stringstd::list,则应该可以将类A和类B链接到一个库中。

使用pimpl模式可能是有用/必需的。

最简单的方法可能是生成一个静态库,该库将c ++ 03库包装起来并用-D_GLIBCXX_USE_CXX11_ABI=0进行编译,然后,只要您仅与c接口,就可以正常编译其余代码++ 03库通过静态库。