2012-09-27 3 views
6

オプションのクラスを含む静的ライブラリ(Lib1と呼ぶことができます)をパッケージ化する最良の方法を見つけようとしています(ClassA )、それ自体は第2の静的ライブラリ(Lib2)を必要とする。つまり、Lib2は、プロジェクトのコードでClassAが参照されている場合にのみ必要です。 Lib1がClassAを使用していない(したがってLib2を含まない)プロジェクトで使用されているのではなく、-ObjCリンカーフラグが必要です(他のプロジェクトの依存関係のために)。ObjC:第三者のライブラリに依存するオプションのクラスを含むスタティックライブラリをコンパイルする方法

私は次の3つのシナリオのための簡単な解決策を考え出すしようとしている:
1)プロジェクトは、私の静的libが含まれ、)
2 -ObjCフラグを指定していない、オプションのクラスを使用していませんプロジェクトには私の静的なlibが含まれていますが、オプションのクラスは使用されませんが、-ObjCフラグ
が必要です。3)プロジェクトには静的なlib + 2番目の静的ライブラリが含まれています。この点)

2番目の静的ライブラリを必要としないように、私のオプションのクラスを最終プロジェクトアプリから削除するリンカフラグがありますか?私は私の静的なlibの複数のバージョン、オプションクラス(標準的な選択肢)を含んでいないもの、別のもの(-ObjCの要件を持つプロジェクトのためのもの)、またはスタブファイルを提供するものをリリースすることです。 2番目の静的ライブラリから必要なすべてのクラスの空の実装を提供していますか?これは、静的ライブラリの世界で共通の問題になる可能性があるようです...このシナリオのベストプラクティスはありますか?

ありがとうございます!


ソリューション:

1)彼らは代わりに-force_load使用することを私の-ObjCユーザーに提案します。 (ありがとうRob!)
2)私はClassAを含まない代替ビルドを持っています。

答えて

6

ベストプラクティスは、常に必要なすべての静的ライブラリ。静的ライブラリを別のものにバンドルしないでください。よく知られている(つまりオープンソースの)静的ライブラリを、あなたが出荷する静的ライブラリに束ねることは絶対に避けてください。これは、同じコードの複数のバージョンで巻き込まれる可能性があるため、最終消費者にとって驚異的な頭痛を引き起こす可能性があります。これから来るバグを追跡することは非常に難しいことです。彼らが運が良ければ、混乱しているコンパイラエラーに遭遇します。彼らが不運な場合、そのコードは予期しない動作をし、ランダムにクラッシュします。

すべての静的ライブラリを別々に出荷してください。さまざまな構成のためにリンクする必要のあるクライアントをクライアントに伝えます。これを避けようとすると、人生は難しくなります。

有用である可能性がある他のいくつかの議論:


-ObjCフラグは、自動ストリッピングを防止する必要があります(詳細はTN1490を参照してください)。

特定の状況を除いてClassAが使用されず、領域を節約したい場合は、おそらくClassAを静的ライブラリに移動する必要があります。または条件付きでコンパイルするには#ifdefを使用します。

-ObjCフラグを削除し、-force_loadを使用して、カテゴリのみのコンパイル単位を個別にロードすることができます(これは、問題の場合は-ObjCが使用されます)。

+0

リンクありがとうございました。彼らは静的なlibの構成をより完全に理解するのに役立ちました! –

+0

私は静的ライブラリに実際に静的ライブラリをバンドルしているわけではありません。静的なlib(Lib1と呼ぶ)では、別の静的なlib(Lib2)がアプリケーションにリンクされているかどうかに依存するクラス(ClassAと言う)があります。 ClassAは、Lib2が含まれていなければ決して使用されません。コンパイラ/リンカは、使用されていなければ、最終アプリからClassAを取り除くのに十分なほどスマートです。しかし、-ObjCリンカフラグが指定されている場合、コンパイラ/リンカはClassAのLib2依存関係を解決しようとしますが、ClassAがアプリケーションで参照されたかどうかは関係ありません。私はClassAを取り除くマジックリンカーの旗を望んでいた –

+1

いくつかの考えで更新されました。これを修正するのは簡単ではありません。 ObjCは非常に動的であり、リンク時にはリンカが見ることができない方法で実行時に参照クラスに完全に標準的です(このようにしてペン先の読み込みが行われます)。大規模な-ObjCパラメータではなく、個別の-force_loadパラメータを渡さずにすべてを同じファイルに配置すると、リンカがこの権利を得ることは非常に難しいです。 –

関連する問題