2013-03-01 11 views
4

В нашем проекте мы используем библиотеку, которая использует libC++ в своей реализации очень сильно. И когда мы добавили Google Maps SDK мы получили ошибку навески:Google Maps SDK для iOS и 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) 

Это произошло потому, что Google Maps SDk использования libstdC++ библиотеки, но мы не можем изменить код, который использует LibC++. Мы пытались инкапсулировать код и библиотеку, которые используют libC++ в статической библиотеке (* .a), но безуспешно. Любой шанс заставить все работать? Возможно, можно связать SDK Google Maps с libC++?

+0

Возможно, вам потребуется поднять запрос функции для этого: 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 thumb up – Ossir

+0

Запрос функции был реализован в последнем SDK Google Maps для выпуска iOS. Так что это уже не проблема. Спасибо за поддержку. Пожалуйста, закройте вопрос. – Ossir

ответ

5

Неопределенные символы, которые вы видите, являются символами, ассоциированными с libstdC++. libstdC++ и libC++ во многом несовместимы с ABI, хотя они представляют вам (в основном) тот же API.

В тех местах, где известна несовместимость ABI, такая как std::string, libC++ использует другую схему переключения, так что строки libstdC++ и libC++ случайно не смешиваются во время выполнения (что может привести к жестким ошибкам времени выполнения отладки).

Если вы видите в своем имени символы, имеющие std::__1, то это символы, ассоциированные с libC++, например. libC++ имеет std::__1::basic_string<..., где, как libstdC++, имеет std::basic_string<....

Вы можете использовать это знание mangling, чтобы помочь вам определить, какие библиотеки нужны, какие реализации std :: lib.

Подача запроса функции, которую вы сделали, была самой лучшей вещью, которую вы могли бы сделать, и спасибо за это! :-)

+0

Это очень интересное знание, но нам действительно нужны оба libC++ для другого, важного для нас, libriry и libstdC++ для SDK Google Maps. Код, который связывается с этими библиотеками, не пересекается, мы даже используем их в разных контроллерах. Если существует флаг привязки для компиляции источника аналогично «-no-objc-arc» ... – Ossir

Смежные вопросы