2

iOS4 と iOS5 で完全に動作するアプリケーションがあります。ARM を対象とした zeromq ライブラリの静的にコンパイルされたバージョンを使用します。Apple は、iOS 6 でクラッシュすると主張しているため、私のアプリケーションを拒否しました (まだリリースされていません..wth?)

iOS 6 GM で試したところ、ZeroMQ ソケットを初期化するとクラッシュすることが確認できました。クラッシュ メッセージは次のとおりです。

dyld: lazy symbol binding failed: Symbol not found: ___sync_fetch_and_add_4
Referenced from: /var/mobile/Applications/00EDEEDA-0068-4061-9188-01D627F9A6D6/OpenAir.app/OpenAir
Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: ___sync_fetch_and_add_4
Referenced from: /var/mobile/Applications/00EDEEDA-0068-4061-9188-01D627F9A6D6/OpenAir.app/OpenAir
Expected in: /usr/lib/libSystem.B.dylib

__sync_fetch_add_4 シンボルがコンパイラのアトミック ビルトインであることを理解しています。ZeroMQ が内部ロックのためにミューテックスを使用していることは知っています。これらのシンボルが存在しない原因となった iOS6 の変更点を突き止めるために、あらゆる場所を検索してきました。

Xcode 4.5 と iOS6 GM を使用すると、ライブラリは同じタイプのメッセージでコンパイルされません。

Undefined symbols for architecture armv7:
  "___sync_fetch_and_add_4", referenced from:
      zmq::socket_base_t::unregister_session(std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> > const&)in libzmq.a(libzmq_la-socket_base.o)

この問題を完全に回避するために、Apple コンパイラのアトミック ビルトインを無効にする方法はありますか?

4

3 に答える 3

0

iOSの初期バージョンにダウングレードする必要はありません。重要なのは、CおよびObjectiveCの開発に利用できる追加のバインディングを使用することだと思います。

http://czmq.zeromq.org/ http://www.zeromq.org/bindings:objc

私はczmqのものを使用し、iOS6プロジェクトでxcodeを使用してこれらのビルドを確認できます。iOS SDKでの使用に関するドキュメントがあまりないため、これらを機能させるためにしばらく時間を費やしましたが、最も簡単な方法は次のとおりです。

  • http://download.zeromq.org/zeromq-3.2.2.tar.gzからzeromqをダウンロードし、コマンドラインから抽出、構成、およびビルドします。
  • 上記のリンクからczmqをダウンロードし、解凍します。
  • srcをインポートし、上記のパスをxcodeプロジェクトに含めます。
  • ターゲットプロジェクトの[ビルド設定]の下の[その他のリンカーフラグ]セクションに-lstdc++を追加します
  • 「czmq.h」をインポートします

ライブラリは正常にリンクされているはずです。そうすれば、準備が整います。

于 2013-03-11T11:59:39.947 に答える
0

Xcode 4.5 にアップグレードした後、2 日間すべてを試しましたが、何も機能しませんでした。私はついにあきらめて、Xcode 4.2.1の使用に戻りました

open -a /Developer/Applications/Xcode.app

明確にするために。iOS 5 SDK を使用してビルドすることにより、iOS 6 でアプリを実行しました。したがって、iOS 6 の機能がすぐに必要でない限り、それで問題ありません。

于 2012-10-20T00:08:41.473 に答える
0

4.3 未満の iOS を対象としていないことを確認してください。静的ライブラリについても同様です。これらを再構築する必要があります。また、Archs から armv6 を削除し、armv7s が存在しない場合は追加してください。

于 2012-09-19T18:56:36.263 に答える