web-dev-qa-db-ja.com

XCode 4.5でZXingライブラリを使用する場合のアーキテクチャarmv7の未定義シンボル

私がやろうとしていること

IPhoneプロジェクトに Zxing 、QRコードリーダーフレームワークを統合します。 ZXing SDKを here からチェックアウトしました。 ScanTestという名前のZXingに付属のサンプルプロジェクトを問題なく実行しました。しかし、ライブラリをプロジェクトに統合しようとすると、前述のエラーが発生します。

プロジェクト仕様

  • ターゲットOS:iOS 6.0
  • 展開ターゲット:iOS 5.0以上。
  • テスト済み:iPhone 4およびiPhone 3GS。
  • XCode:Xcode 4.5.1
  • ZXingバージョン:2.0

問題

ZXing readme file ですべての統合手順を実行した後、ビルドすると、次のようなビルドエラーが発生します。

_Undefined symbols for architecture armv7:
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      zxing::qrcode::Detector::computeDimension(zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, float) in libZXingWidget.a(Detector-B8B28E953F840D47.o)

Undefined symbols for architecture armv7:
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      zxing::Exception::Exception(char const*) in libZXingWidget.a(Exception.o)
      zxing::common::StringUtils::guessEncoding(unsigned char*, int, std::map<unsigned int, std::string, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::string> > >
_

そのような27のエラーがあります。最初の2つだけをコピーしました。

私は何を見つけましたか

さて、私は thisthisthisthisthisthisthis stackoverflowのスレッドで、すべて同じエラーメッセージが表示されます。どのソリューションも私にとってはうまくいきませんでした。

次に、ZXingフォーラムで同じ問題を議論している this closed thread を見つけました。その議論から、いくつかの可能な解決策があります(いくつかのために働いた)

最初のエラーは(おそらく)main.mの名前をmain.mmに変更していないためです。 2番目のエラーは、(おそらく)ウィジェットライブラリに対してリンクしていないためです

また、main.mの名前を変更し、確実に見つけられるようにライブラリを追加したかどうかをクロスチェックしました。だからそうではありません。

メインプロジェクトに合わせてライブラリのアーキテクチャを「標準(armv7、armv7s)」に変更した後、アプリを正常にコンパイルできました。

私のプロジェクト、ターゲット、ライブラリプロジェクト(デバッグ、配布、リリース用)アーキテクチャはStandard (armv7, armv7s)として与えられます。だから運もありません。

それから彼らはこれを言って問題を閉じました、

zxingプロジェクトが更新され、armv7s Archが追加され、armv6 Archが削除されました。これらの変更は、(1)armv7sであるiPhone 5用にビルドするため、および(2)Xcode 4.5にはarmv6のサポートが含まれていないため、まったくビルドするために必要です。独自のプロジェクトファイルがある場合は、自分でこれらの変更を行う必要があります。これらはzxingに固有ではない一般的な変更であるため、問題が発生した場合は、StackOverflowのような一般的なフォーラムでより多くの情報を入手できます。

StackOverflowにいます。

もう一つのポイント

ZXing統合 READMEファイル では、統合の最初のステップは、

1)「_zxing/iphone/ZXingWidget/_」の下の「ZXingWidget.xcodeproj」ファイルを見つけます。 ZXingWidget.xcodeprojをドラッグし、Xcodeプロジェクトの「グループとファイル」サイドバーのルートにドロップします。ダイアログが表示されます。[追加]をクリックする前に、[アイテムのコピー]がオフになっていて、[参照タイプ]が[プロジェクトに相対]であることを確認してください。または、プロジェクトナビゲータを右クリックして、「ファイルを「MyProject」に追加」を選択します。

ZXingWidget.xcodeprojファイルをプロジェクトにドラッグしたとき、ダイアログはありませんでした。プロジェクトがプロジェクトに直接追加され、「アイテムをコピー」および「参照タイプ」プロパティを設定できませんでした。 Xcode 4.5の新機能かバグかはわかりません。これはREADMEファイルに従って正しく従うことができなかった唯一のステップです。

さて、あなたは私が持っているすべての情報を持っています。これを6時間修正しようとしています。何か案が?

37
Krishnabhadra

上記のすべての提案に従いましたが、すべて正常にコンパイルされますが、リンクは失敗します。

"std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
  zxing::qrcode::Detector::computeDimension(zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, zxing::Ref<zxing::ResultPoint>, float) in libZXingWidget.a(Detector-B8B28E953F840D47.o)
  zxing::GridSampler::checkAndNudgePoints(zxing::Ref<zxing::BitMatrix>, std::vector<float, std::allocator<float> >&) in libZXingWidget.a(GridSampler.o)
  zxing::qrcode::DecodedBitStreamParser::decodeNumericSegment(zxing::Ref<zxing::BitSource>, std::string&, int) in libZXingWidget.a(DecodedBitStreamParser-64E27B33E79CBC52.o)
  zxing::qrcode::Mode::forBits(int) in libZXingWidget.a(Mode.o)

...「std :: ios_base :: Init :: Init()」、参照元:

  ___cxx_global_var_init in libZXingWidget.a(QRCodeReader-F470BE6889D3F76D.o)
  ___cxx_global_var_init in libZXingWidget.a(Decoder-3DF771F40A970F8E.o)
  ___cxx_global_var_init in libZXingWidget.a(FormatReader.o)
  ___cxx_global_var_init in libZXingWidget.a(QRCodeReader-C190599C861BFE46.o)
  ___cxx_global_var_init in libZXingWidget.a(DecodeHints.o)
  ___cxx_global_var_init in libZXingWidget.a(BinaryBitmap.o)
  ___cxx_global_var_init in libZXingWidget.a(DecoderResult.o)

等々...

Xcode 4.5.2を実行しています。 main.mの名前をmain.mmに変更し、View Controllerの名前も.mから.mmに変更しました。アーキテクチャはすべて「armv7 armv7s」です。

はぁ...

更新

Apple devforumsの誰かが私の問題に対する答えを持っていました:

C++標準ライブラリが一致していないようです。プロジェクトのビルド設定はclangのC++標準ライブラリを使用していますが、libZXingWidget.aはGNU C++標準ライブラリを使用するようにコンパイルされています。

これを試してください:ZXingWidget.xcodeprojを開き、「C++標準ライブラリ」を「libc ++」に設定してから、すべてをクリーンアップして再構築します。

それでもうまくいかない場合は、プロジェクトとZXingWidget.xcodeprojの両方で「C++標準ライブラリ」を「libstdc ++」に設定してみてください

最初の提案はトリックをしました。

10
Patrick Gibson

Xcodeにドラッグアンドドロップしたプロジェクトの1つの値を変更することで解決しました。

enter image description here

セットする:

アクティブなアーキテクチャのみをビルド->デバッグ->いいえ

それが人々を助けることを願っています:)!

6
jimbob

これで問題は解決しました。他に何も機能しませんでした。

enter image description here

6
RawMean

ZXingWidgetターゲットの「Build Active Architecture Only」フラグを「NO」に設定する必要がある場合もあります。

4
diadyne

上記のすべての提案に従いましたが、すべてが正常にコンパイルされますが、それでも失敗しますが、エラーメッセージ:

Undefined symbols for architecture armv7:
"_CVPixelBufferLockBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetBytesPerRow", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetWidth", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_kCVPixelBufferPixelFormatTypeKey", referenced from:-[ZXingWidgetController initCapture] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferGetHeight", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)
"_CVPixelBufferUnlockBaseAddress", referenced from:-[ZXingWidgetController captureOutput:didOutputSampleBuffer:fromConnection:] in libZXingWidget.a(ZXingWidgetController.o)ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)

したがって、CoreVideo.frameworkを追加すると、コンパイルは問題ありません。

1
riven

何回も何度も試してみましたが、数え切れないほど試してみたところ、プロジェクトをきれいにするだけでいいことがわかりました。これは、C++言語の方言とC++標準ライブラリをコンパイラのデフォルトに変更した後に必要でした。私はいつもシンプルなことをしていますが、私はそれを逃し、30分を無駄にしました。

0
stackdaddy