4

私たちのプロジェクトでは、実装に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)

これは、GoogleマップのSDKがlibstdc ++ライブラリを使用しているために発生しましたが、libc++を使用するコードを変更することはできません。libc ++を使用するコードとライブラリを静的ライブラリ(* .a)にカプセル化しようとしましたが、成功しませんでした。物事を機能させるチャンスはありますか?たぶん、Google MapsSDKをlibc++とリンクすることは可能ですか?

4

1 に答える 1

5

表示されている未定義のシンボルは、libstdc++に関連付けられているシンボルです。libstdc++とlibc++は、(ほとんど)同じAPIを提供しますが、ほとんどABIと互換性がありません。

たとえば、ABIの非互換性がわかっている場所ではstd::string、libc ++は異なるマングリングスキームを使用して、実行時にlibstdc++とlibc++の文字列が誤って混在しないようにします(デバッグが困難な実行時エラーが発生します)。

名前に含まれているシンボルが表示されている場合std::__1、それらはlibc ++に関連付けられているシンボルです。たとえば、libc ++にはstd::__1::basic_string<...、がありますが、libstdc++には。がありstd::basic_string<...ます。

このマングリングの知識を使用して、どのライブラリがstd::libのどの実装を必要としているかを判断するのに役立てることができます。

あなたが行った機能リクエストを提出することはあなたができる最高のことでした、そしてそれをしてくれてありがとう!:-)

于 2013-03-01T17:17:02.743 に答える