web-dev-qa-db-ja.com

展開ターゲットが7.0の場合のアーキテクチャエラーの未定義のシンボル

ネイティブiOSアプリケーション(多数の.aライブラリ)でサードパーティのフレームワークを使用しています。私のアプリケーションはXCode5ベースのSDK7.0で開発されています。

デプロイメントターゲットが6.1の場合、ライブラリは正常にコンパイルおよびリンクされます(ライブラリとヘッダーの検索パスは適切です)。ただし、展開ターゲットを7.0に変更すると、次のリンカーエラーが発生します。

Undefined symbols for architecture i386:
  "std::string::find_last_of(char const*, unsigned long) const", referenced from:
      GetExecutionDir(ECTemplateString<char>&, char*, bool) in myLibrary.a(moPlatForm.o)
  "std::string::find(char const*, unsigned long) const", referenced from:
      ParseLog(std::string const&, unsigned int&, CmoDateTime&, int&, std::string&) in myLibrary.a(AppLog.o)
  "std::string::size() const", referenced from:
      mo::CmoParam::WriteToStream(void*, mo::STREAM_STATE*) in myLibrary.a(moParams.o)
  "std::string::c_str() const", referenced from:
      GetExecutionDir(ECTemplateString<char>&, char*, bool) in myLibrary.a(moPlatForm.o)
      CMocaFileTransfer::UpdateParamsForGetTraceFiles(mo::CmoParamList&, long) in myLibrary.a(RobieFileTransfer.o)
      CMocaFileTransfer::AddTraceFileForUpload(std::string const&, std::string const&) in myLibrary.a(RobieFileTransfer.o)
      CMocaFileTransfer::CreateParamsForSendTraceFiles(mo::CmoObject&) in myLibrary.a(RobieFileTransfer.o)
      mo::CmoParam::WriteToStream(void*, mo::STREAM_STATE*) in myLibrary.a(moParams.o)
      ParseLog(std::string const&, unsigned int&, CmoDateTime&, int&, std::string&) in myLibrary.a(AppLog.o)
      CAppLog::LogExists(unsigned int) in myLibrary.a(AppLog.o)
      ...

ライブラリは少し古いので、互換性の問題があるかどうかはわかりません。 iOS 6をサポートする予定はないので、展開ターゲットを7.0に設定する必要があります。どんな種類のヘルプ/指示も素晴らしいでしょう。

23
Guven

XCodeがプロジェクト内でC++ファイルを見つけることができない場合、libstd ++は不要であると想定していることがわかります。したがって、C++ファイルをプロジェクトに手動で追加する必要があります(空の.mmファイルで十分です)。それが解決策です。

すべてのクレジットはこれに行きます answer この Stackoverflowスレッド

28
Guven

私にとっては、依存関係に「stdc ++。dylib」の代わりに「stdc ++。6.0.9.dylib」を含めると、リンカーエラーも解決されました

46
Denis

MyLibrary.aはC++コードの呼び出しで構築され、C++標準ライブラリとしてlibstdc ++を使用しているように見えます。アプリケーションプロジェクトでは、おそらくコンパイラのデフォルトとして、代わりにlibc ++を指定している可能性があります。

Libstdc ++に切り替えて、エラーがなくなる(または少なくとも変更される)かどうかを確認してください。最終的な解決策は、新しい標準ライブラリに対して構築されたライブラリである可能性があります。

8
Phillip Mills