Google Maps SDK for iOS和libc ++

Oss*_*sir 4 libstdc++ ios 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)
Run Code Online (Sandbox Code Playgroud)

这是因为谷歌地图sdk使用libstdc ++库,但我们不能改变使用libc ++的代码.我们尝试封装在静态库(*.a)中使用libc ++的代码和库,但没有成功.什么机会让事情有效?也许,可以将Google Maps SDK与libc ++相关联?

How*_*ant 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的哪些实现.

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