在我们的项目中,我们使用的库在其实现中非常紧密地使用了 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++ 链接起来?
最佳答案
您看到的 undefined symbol 是与 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 的哪些实现。
提交您所做的功能请求是您能做的最好的事情,感谢您这样做! :-)
关于ios - 适用于 iOS 和 libc++ 的 Google Maps SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15155464/