37

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

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

プロジェクト仕様

  • 対象OS:iOS 6.0
  • 導入対象:iOS 5.0以上。
  • テスト済み: iPhone 4 および iPhone 3GS。
  • Xcode : Xcode 4.5.1
  • ZXing バージョン: 2.0

問題

ビルドすると、 ZXing readme ファイルのすべての統合ステップを実行した後、次のようなビルド エラーが発生します。

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 つだけをコピーしました。

わかったこと

まあ、私はこれこれこれこれこれこれ、スタックオーバーフローのこのスレッドをすべて同じエラーメッセージで調べました。解決策はどれもうまくいきませんでした。

その後、ZXing フォーラムで同じ問題について話し合っているこのクローズド スレッドを見つけました。その議論から、いくつかの可能な解決策は(いくつかのために働いた)

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

また、main.m の名前を変更し、ライブラリを追加したかどうかをクロス チェックして、確かに追加したことを確認しました。したがって、これは当てはまりません。

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

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

そして彼らはこう言って問題を締めくくった。

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

ここにいるのは、StackOverflow です。

もう1点

ZXing 統合README ファイルでは、統合の最初のステップは次のとおりです。

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

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

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

4

7 に答える 7

57

さて、ついに私はそれを働かせました..将来これに遭遇する人のために..

  1. main.m ファイルの名前を main.mm に変更します。

    ZXing の README には、これが必要な理由が記載されています

    ZXingWidgetController を使用して独自のプロジェクトをビルドしようとすると、「未定義の参照」などのリンカー エラーが発生することがあります。このエラーが C++ の未定義参照のように見える場合は、main.m の名前を main.mm (Objective-C++ ソース接尾辞) に変更すると問題が解決する場合があります。

  2. ZXing ライブラリ関数を使用するファイル (ViewController/View) の名前を変更して、拡張子も .mm にします。

  3. プロジェクト全体のアーキテクチャ設定を確認してください。プロジェクト設定、ターゲット設定、およびZXing プロジェクト (メイン プロジェクトに追加したもの) とターゲット設定で、アーキテクチャ有効なアーキテクチャarmv7 armv7sとして指定します。

  4. メインプロジェクト-> Build Settingsでスクロールし、オプション、 C++ Language DialectおよびC++ Standard Libraryを見つけます。両方のオプション「コンパイラのデフォルト」を選択します。(これは私が見逃したステップです。最新の XCode テンプレートには古いバージョンとは異なるコンパイラの既定の設定があるため、必要です)。

  5. また、ZXingWidget の「Build Valid Architecture Only」フラグを に設定する必要がある場合もありますNO。私の場合、このフィールドはすでにNO

これらは私のために問題を修正しました..

アップデート

2013 年 12 月、Google は ZXing iOS/Objective C ポートを廃止しました。そのため、iOS 用の Zxing プロジェクトは、新しい iOS バージョン用に維持および更新されなくなりました。また、Zxing は、新しい XCode バージョンの標準アーキテクチャの 1 つである Arm64 アーキテクチャをサポートしていません。

したがって、開発者は、iOS7 以降で利用可能なバーコードを読み取るために、ネイティブの Apple フレームワークに移行することをお勧めします。ステップバイステップのチュートリアルについては、これを参照してください。

于 2012-10-19T08:20:24.007 に答える
10

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

"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)

等々...

Xcode4.5.2を実行しています。main.mの名前をmain.mmに変更し、ビューコントローラーの名前も.mから.mmに変更しました。すべてのアーキテクチャは、「armv7armv7s」です。

はぁ...

アップデート

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

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

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

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

最初の提案でうまくいきました。

于 2012-12-07T00:15:47.897 に答える
6

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

ここに画像の説明を入力

設定:

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

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

于 2012-12-27T17:21:22.967 に答える
4

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

于 2012-10-25T21:29:10.313 に答える
0

私はすべてを何度も調べましたが、数え切れないほど試した後、プロジェクトをクリーンアップする必要があることがわかりました。これは、C++ 言語の方言と C++ 標準ライブラリをコンパイラの既定値に変更した後に必要でした。私はいつも簡単なことをしていますが、それを逃して 30 分無駄にしました。

于 2013-04-03T19:16:30.997 に答える