2013-03-01 118 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

相關問題