ios - 适用于 iOS 和 libc++ 的 Google Maps SDK

标签 ios libstdc++ libc++ google-maps-sdk-ios

在我们的项目中,我们使用的库在其实现中非常紧密地使用了 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/

相关文章:

objective-c - iPhone 测试 : testing IBOutlets

C++11 与 C++98 转换运算符行为发生变化?

opencv - 如何使用 libc++ STL 库为 Android 构建 OpenCV?

c++ - 在 libc++ 上,为什么 regex_match ("tournament", regex ("tour|to|tournament")) 失败?

ios - iOS swift 应用程序中的 Google 样式 map 集成,JSON 文件中的问题

ios - 检查文件是否存在于路径中并根据结果设置按钮

ios - 基于平移手势翻译的滚动scrollview

c++ - 静态 libstdc++.a 中的全局符号在共享 libstdc++.so 中是局部的

c++ - 为什么从管道读取时 libc++ getline 会阻塞,而 libstdc++ getline 不会?

c++ - 什么是 __builtin_operator_new 及其工作原理?