13

私はiOS静的ライブラリを構築しています(https://github.com/jverkoey/iOS-Frameworkに従って)。私は SBJson と AFNetworking に依存しています。バージョンの問題を回避し、インストールを簡単にするために、これらのライブラリを含めたいと思います。そのためには、名前の競合を避けるために、これらのライブラリにプレフィックスを付ける必要があります。

簡単な方法で他の静的ライブラリにプレフィックスを付けるにはどうすればよいですか?

理想的には、それは私のビルド プロセスの一部になります。あまり理想的ではありませんが、許容できるのは、適切な方法でリファクタリングして名前を変更する方法に関するヒントです。

4

1 に答える 1

21

唯一の安全な解決策 (これをまったく行わないこと以外) は、すべてのシンボルにプレフィックスを付けて依存関係を構築することです。

接頭辞を付ける最も簡単な方法は、古典的な「検索と置換」です。これはエラーが発生しやすいので、.a をヒットし、nm -aプレフィックスのないシンボルがないか結果を精査することをお勧めします。

2 番目のより安全な方法は、2 パスのコンパイル プロセスを使用することです。

  • 最初のパスは依存プロジェクトをビルドし、実行nmしてすべてのシンボルをヘッダー ファイルにダンプします。
  • 2 番目のパスでは、依存プロジェクトが再度ビルドされますが、今回は生成されたプレフィックス ヘッダー ファイルがプリコンパイル済みヘッダーにインポートされます。このプレフィックス ヘッダーは、名前が変更されたシンボルを適切に参照するために、フレームワーク内の依存関係からシンボルを参照する任意の場所で使用する必要があります。

参考までに、これをNimbusで使用して Nimbus プレフィックス ヘッダーを生成します: https://github.com/jverkoey/nimbus/blob/master/scripts/generate_namespace_header

これにより、プレフィックス付きのバージョンの Nimbus が埋め込まれた .framework を配布できます。

結果の .a をフレームワークにリンクし、サード パーティの開発者が必然的に依存関係の独自のバージョンをプロジェクトにリンクするときに、リンカーの競合を安全に回避できます。

于 2013-10-13T02:54:36.240 に答える