我目前遇到的问题是,我需要构建一个应用程序,其中似乎使用不同的c ++版本来构建库。
当我构建时,在一个库中出现了undefined reference std::__cxx11::basic_string
错误,而当我使用-D_GLIBCXX_USE_CXX11_ABI=0
进行构建时,则在另一个库的std::string
中出现了未定义的参考错误。
它们都是外部库,不幸的是我无法重建自己。有解决方法吗?
答案 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::string
或std::list
,则应该可以将类A
和类B
链接到一个库中。
使用pimpl模式可能是有用/必需的。
最简单的方法可能是生成一个静态库,该库将c ++ 03库包装起来并用-D_GLIBCXX_USE_CXX11_ABI=0
进行编译,然后,只要您仅与c接口,就可以正常编译其余代码++ 03库通过静态库。