2013-03-01 89 views
4

在我们的项目中,我们使用的库非常紧密地在其实现中使用libC++。而当我们加入谷歌地图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) 

它的发生是因为谷歌地图的libstdC++库SDK使用,但我们无法改变其使用的libC++编写代码。我们试图在静态库(* .a)中封装使用libC++的代码和库,但没有成功。 有没有机会让事情奏效?也许,可以将Google Maps SDK与libC++关联起来?

+0

您可能需要针对此功能提出功能请求:http://code.google.com/p/gmaps-api-issues/issues/entry?template=Maps%20SDK%20for%20iOS% 20-%20Feature%20Request – 2013-03-01 12:58:44

+2

http://code.google.com/p/gmaps-api-issues/issues/detail?id=5036大拇指 – Ossir 2013-03-01 13:38:52

+0

功能请求已在上次Google Maps SDK for iOS版本中实施。所以这已经不是问题了。感谢您的支持。请关闭问题。 – Ossir 2013-04-10 12:03:44

回答

5

您看到的未定义符号是与libstdC++关联的符号。 libstdC++和libC++在很大程度上与ABI不兼容,尽管它们在很大程度上呈现给您相同的API。

在已知ABI不兼容的地方,如std::string,libC++使用不同的mangling scheme,这样libstdC++和libC++字符串在运行时不会意外混合(这会导致难以调试的运行时错误)。

如果您看到名称中包含std::__1的符号,那么这些符号是与libC++关联的符号,例如, libC++有std::__1::basic_string<...,其中libstdC++有std::basic_string<...

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

归档你做的功能请求是你能做的最好的事情,并且感谢你这样做! :-)

+0

这是非常有趣的知识,但我们确实需要另外一个libC++,对于我们来说很重要,对于Google Maps SDK我们需要libriry和libstdC++。与这些库链接的代码不相交,我们甚至在不同的控制器中使用它们。如果存在用于编译源的链接标志,例如“-no-objc-arc”... – Ossir 2013-03-03 09:35:57