オプションのクラスを含む静的ライブラリ(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を含まない代替ビルドを持っています。
リンクありがとうございました。彼らは静的なlibの構成をより完全に理解するのに役立ちました! –
私は静的ライブラリに実際に静的ライブラリをバンドルしているわけではありません。静的なlib(Lib1と呼ぶ)では、別の静的なlib(Lib2)がアプリケーションにリンクされているかどうかに依存するクラス(ClassAと言う)があります。 ClassAは、Lib2が含まれていなければ決して使用されません。コンパイラ/リンカは、使用されていなければ、最終アプリからClassAを取り除くのに十分なほどスマートです。しかし、-ObjCリンカフラグが指定されている場合、コンパイラ/リンカはClassAのLib2依存関係を解決しようとしますが、ClassAがアプリケーションで参照されたかどうかは関係ありません。私はClassAを取り除くマジックリンカーの旗を望んでいた –
いくつかの考えで更新されました。これを修正するのは簡単ではありません。 ObjCは非常に動的であり、リンク時にはリンカが見ることができない方法で実行時に参照クラスに完全に標準的です(このようにしてペン先の読み込みが行われます)。大規模な-ObjCパラメータではなく、個別の-force_loadパラメータを渡さずにすべてを同じファイルに配置すると、リンカがこの権利を得ることは非常に難しいです。 –