12


いくつかの背景-http : //db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/にあるDineyのガイドを使用してカスタムフレームワークを構築しました

ARCベースのフレームワークであるarmv6/armv7の両方用に構築されており、4.3のデポリメントターゲットでコンパイルされています。

結果のフレームワークを5.0プロジェクトに配置するとうまく機能しますが、4.3プロジェクト(ARCまたは非アーク、関係ありません)に配置すると、実際には理解できない次のようになります...

libarclite.aを手動で追加しようとしましたが、何も変更されませんでした。

ld:アーキテクチャarmv7コマンド/Developerの/Users/freak4pc/Project/MyFramework.framework/MyFrameworkおよび/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o)に重複するシンボル_objc_retainedObject /Platforms/iPhoneOS.platform/Developer/usr/bin/clangが終了コード1で失敗しました

これに関する助けをいただければ幸いです。
ありがとう
シャイ

4

2 に答える 2

15

私は同じ問題に苦しんでいます。回避策は、フレームワークの展開ターゲットをiOS5に設定することです(ただし、他の問題が発生しないかどうかを確認してください)。

次に、iOS4をターゲットにしている場合は、マスタープロジェクトでARCを使用する必要があります。そうしないと、libarcliteが失われます。私の解決策は、ARCを使用するかどうかに応じて、2つのフレームワークを提供することです。

Appleの開発フォーラムへの2つのリンクともう少し情報があります: https ://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

更新:より良い方法があります。iOS5の最小ターゲットを使用して静的ライブラリを構築し、/ Developer / Platforms / iPhoneOS.platform / Developer / usr / lib / arc / libarclite_iphoneos.a(および/Developer/usr/lib/arc/libarclite_iphonesimulator.a)を手動で追加するだけです。プロジェクトはARCを使用しておらず、iOS4のサポートが必要です。

更新2:実際には、リンカーフラグ-fobjc-arcを使用します。これにより、libarcliteがライブラリにまだ存在しない場合は、ライブラリにリンクされます。最良の解決策。

于 2011-12-06T18:58:42.063 に答える
2

うわー、それは大変な乗り物でしたが、私はついにそれを解決しました!

最終的なアイデアのきっかけとなったのは@steipeteのコメントでした。少し複雑な状況なので、この問題を乗り越えた可能性のある人にも説明しようと思います。

  1. iOS 4.3でARC対応のフレームワークをコンパイルすると、libarclite.soが自動的に4.3ARCと5.0ARCを「ブリッジ」します。このフレームワークが4.3プロジェクトにインポートされたとき、arcliteは実際には2回リンクされていました。1回はフレームワーク(4.3)で、もう1回はプロジェクト自体でリンクされていたため、「シンボルの重複」エラーが発生しました。つまり、フレームワークをコンパイルする必要があります。 5.0、プロジェクトは4.3にすることができます。しかしその後 ;
  2. 私のフレームワークは、@ matttのAFNetworkingを使用して、さまざまなAPのHTTPリクエストとJSON解析を実行しています。AFNetworkingは、コンパイル中にターゲットがiOS5であるかどうかを自動的にチェックしNSJSONSerialization、そうである場合はを使用します。そうでない場合は、などのインポートされたJSONライブラリにフォールバックしますJSONKit
  3. iOS5用のAFNetworking対応フレームワークをコンパイルすると(問題1を回避するため)、自動的にアタッチされます。これにより、4.3プロジェクトで例外が発生します。つまり、コンパイルする前にNSJSONSerialization、コンパイル方向を手動で探して、への呼び出しを削除する必要があります。NSJSONSerialization、したがって、4.3互換ライブラリ(私の場合JSONKit)に自動的にフォールバックします。そのコンパイル条件は、AFHTTPClient.mおよびAFJSONRequestOperation.mにあります(例#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6) 。
  4. これらの条件を取り除いた後、NSJSONSerializationの代わりにJSONKitを使用してiOS5のフレームワークを正常にコンパイルし、iOS4.3プロジェクトで正常に使用できるようになりました。

これが私のように数日間これに苦労するかもしれない他の誰かを助けることを願っています:)

シャイ。

于 2011-12-07T12:49:22.580 に答える