2013-03-01 9 views
4

Dans notre projet, nous utilisons une bibliothèque qui utilise libC++ très étroitement dans son implémentation. Et quand nous avons ajouté Google Maps SDK nous avons eu erreur de liaison:SDK Google Maps pour iOS et libC++

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) 

Il est arrivé parce que google maps utilisation sdk bibliothèque libstdC++, mais nous ne pouvons pas modifier le code qui utilisent libC++. Nous avons essayé d'encapsuler du code et une bibliothèque qui utilisent libC++ dans une bibliothèque statique (* .a), mais sans succès. Une chance de faire fonctionner les choses? Peut-être, est-il possible de lier Google Maps SDK avec libC++?

+0

Vous pourriez avoir besoin de soulever une demande de fonctionnalité pour celui-ci: http://code.google.com/p/gmaps-api-issues/issues/entry?template=Maps%20SDK%20for%20iOS% 20-% 20Feature% 20Request –

+2

http://code.google.com/p/gmaps-api-issues/issues/detail?id=5036 pouce vers le haut – Ossir

+0

demande de fonctionnalité a été implémentée dans le dernier SDK Google Maps pour iOS version. Donc ce n'est déjà pas un problème. Merci pour votre aide. S'il vous plaît, fermez la question. – Ossir

Répondre

5

Les symboles non définis que vous voyez sont des symboles associés à libstdC++. libstdC++ et libC++ sont en grande partie incompatibles avec ABI, même s'ils vous présentent (en grande partie) la même API. Dans les endroits où l'incompatibilité ABI est connue, comme std::string, libC++ utilise un schéma de gestion différent pour que les chaînes libstdC++ et libC++ ne soient pas mélangées accidentellement au moment de l'exécution (ce qui causerait des erreurs d'exécution difficiles à déboguer).

Si vous voyez des symboles qui ont std::__1 en leur nom, alors ce sont des symboles associés libC++, par exemple libC++ a std::__1::basic_string<..., où libstdC++ a std::basic_string<....

Vous pouvez utiliser cette connaissance de mutiler pour vous aider à déterminer quelles sont les bibliothèques qui implémentations qui ont besoin std :: lib.

Dépôt de la demande de fonctionnalité que vous avez fait était la meilleure chose que vous pourriez faire, et je vous remercie de le faire! :-)

+0

C'est une connaissance très intéressante, mais nous avons vraiment besoin de libC++ pour un autre, important pour nous, libriry et libstdC++ pour Google Maps SDK. Code qui lien avec ces bibliothèques, ne se croisent pas, nous les utilisons même dans différents contrôleurs. S'il existe un indicateur de liaison pour la source de compilation de même "-no-objc-arc" ... – Ossir

Questions connexes