4

在我们的项目中,我们使用在其实现中非常紧密地使用 libc++ 的库。当我们添加 Google Maps SDK 时,我们得到了链接错误:

Undefined symbols for architecture i386:
 "std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
     gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
     _GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
     gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)

 "std::string::_Rep::_S_empty_rep_storage", referenced from:
     gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
     _GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
     gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)
     gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
     _GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
     gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)
     gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
     _GMS_objc_lookUpClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getClass in GoogleMaps(GMSRenames.o)
     _GMS_objc_getProtocol in GoogleMaps(GMSRenames.o)
     gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)

 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
     gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
     gmscore::model::Point2D::StringValue() const in GoogleMaps(Point2D.o)

 "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:
     gmscore::utils::gmsutils::StringPrintf(char const*, ...) in GoogleMaps(GMSUtils.o)
     gmscore::vector::CameraPosition::StringValue() const in GoogleMaps(CameraPosition.o)

发生这种情况是因为 google maps sdk 使用 libstdc++ 库,但我们无法更改使用 libc++ 的代码。我们尝试将使用 libc++ 的代码和库封装在静态库 (*.a) 中,但没有成功。有机会让事情发挥作用吗?也许,可以将 Google Maps SDK 与 libc++ 链接起来?

4

1 回答 1

5

您看到的未定义符号是与 libstdc++ 关联的符号。libstdc++ 和 libc++ 在很大程度上是 ABI 不兼容的,即使它们呈现给您(很大程度上)相同的 API。

在已知 ABI 不兼容的地方,例如std::string,libc++ 使用不同的处理方案,以便在运行时不会意外混合 libstdc++ 和 libc++ 字符串(这会导致难以调试的运行时错误)。

如果您看到std::__1名称中有符号,那么这些符号就是与 libc++ 相关的符号,例如 libc++ 具有std::__1::basic_string<...,其中 libstdc++ 具有std::basic_string<...

您可以使用这种修改知识来帮助您确定哪些库需要 std::lib 的哪些实现。

提交您所做的功能请求是您能做的最好的事情,感谢您这样做!:-)

于 2013-03-01T17:17:02.743 回答