1

プロジェクトで静的ライブラリを使用しようとしています。静的ライブラリは、CoreData、CFNetwork、AddressBookなどのいくつかのフレームワークに依存しています。

静的ライブラリもカテゴリを使用するため、メインプロジェクトの[その他のリンカー設定]で-all_loadリンカーオプションを使用する必要があります。これを有効にすると、メインプロジェクトが静的ライブラリ(CoreData、CFNetwork、AddressBookなど)と同じフレームワークにリンクされていないことに関連する120のエラーが発生します。

開発者が静的ライブラリを使用してそれにリンクすることは非常に不便ですが、それでもライブラリがリンクするすべてのフレームワークにリンクする必要があります。メインプロジェクトが静的ライブラリによってリンクされているすべてのフレームワークに自動的にリンクするように、このプロセスを自動化する方法はありますか?

XCode4.4を使用しています。

編集:より明確にするために、私は次のものを持っています:

StaticLibrary.xcodeproj
    - AFNetworking
        - files...
    - CoreData
        - categories for NSManagedObjectContext, for convenience
    - AddressBook
        - convenience methods for working with contacts

このプロジェクトのターゲットは、[ビルドフェーズ]>[バイナリとライブラリのリンク]で必要なフレームワークにリンクされています。これには、CoreData.framework、AddressBook.frameworkなどが含まれます。

今、私がやりたいのは、このライブラリを私の別のプロジェクトに追加することです。実際、これから作成するすべての新しいプロジェクトにこのライブラリを追加したいので、自分が作成した便利な関数/カテゴリにいつでも簡単にアクセスできます。つまり、ライブラリをプロジェクトに追加してから、.aファイルを[ビルドフェーズ]> [バイナリとライブラリのリンク](メインプロジェクトの)に追加します。私はまた、私が知っている他の必要なことはすべて行います(コメントを参照)。

私がしたいこと:メインプロジェクトはライブラリにリンクされているので、ライブラリのすべてのリンクを継承し、メインプロジェクトもCoreData.framework、AddressBook.frameworkなどにリンクされています。

何が起こるか:メインプロジェクトは、ライブラリが必要とするものにリンクされていないため、エラーが発生します。

リンクされたフレームワークを静的ライブラリからメインプロジェクトに自動的に追加する方法はありますか、またはライブラリをCoreDataStaticLibraryなどに分割してから、開発者にCoreData.frameworkと静的ライブラリをプロジェクトに追加するように要求する必要がありますか?毎回ターゲットにしますか?

4

2 に答える 2

1

-all_load私が理解しているように、ライブラリにカテゴリのみが含まれている場合にのみ必要です。それ以外の場合は、 を使用できます-ObjC。とにかく、それは私が使っているものです。

また、スタティック ライブラリをビルドすると、コンパイルされたオブジェクト モジュールのアーカイブが作成されるだけです。ライブラリで解決される外部依存関係はありません。実際には、一連のオブジェクト コード ファイルの 1 つのコレクションと考えてください。

そのため、最終的に実行可能ファイルをリンクすると、コンパイル済みのすべてのコードが、静的ライブラリ内のコンパイル済みコードのアーカイブと共にリンクされます。リンカーはすべてのシンボルを解決することを想定しているため、すべてのシンボルを完全に解決するために必要なすべてのライブラリ (フレームワーク) がどこにあるかをリンカに指示する必要があります。

XCode は、静的ライブラリ サブプロジェクトの内部を調べ、そのプロジェクトからフレームワークの依存関係を引き出して、最終的なプロジェクトのリンカー呼び出しに追加できるようにする必要がありますか? もちろん。しかし、私はそれを自動的に行う方法を知りません。

必要に応じて、ライブラリのポッドファイルを作成し、CocoaPods を使用てプロジェクトの依存関係を管理できます。

于 2012-09-11T11:16:25.877 に答える
0

問題は、同じシンボルを数回含めていることです。私は同じ問題に何度か遭遇しましたが、解決策は基本的に「-all_load」フラグの機能を理解することです。これは、この SO の質問でよく説明されています。

そうは言っても、そのようにライブラリからフレームワークを参照することは決してありません。これらのフレームワークは動的にリンクされているため、実際には静的ライブラリに属していません。それらを指す参照があるだけです。

そのようなライブラリのユーザーは、適切に機能させるために必要なフレームワークを追加する責任があります。つまり、ライブラリをそのようなフレームワークにリンクする必要はなく (そのようなことは意味がないため)、それを使用するプロジェクトにそれらを追加するだけです。(Restkit を見て、それがどのように行われているかを確認してください)。

また、「all_load」フラグを取り除き、それを「force_load /path/to/the/library」に置き換えることができると思います all_load は、ライブラリにカテゴリのみが含まれている (クラスがまったくない) 場合にのみ必要です。

それがどうなるか、幸せなコーディングを教えてください!

于 2012-09-11T14:56:29.037 に答える