1

2つのiOS.frameworksを作成しました

どちらも完全にコンパイルされます

私の構造は次のとおりです。

iPadProject
  - framework1
     - framework2

つまり、Framework2はframework1に含まれ、framework1は実際のiPadプロジェクトに含まれています。

したがって、私の問題は、framework1とframework2の両方をiPadProjectに追加すると、framework2からの重複するシンボルについての泣き言のためにコンパイルされないことです(これは、framework1にすでに含まれているため論理的です)

しかし、framework1からメソッドにアクセスするときにframework1のみをiPadProjectに含めると、framework2からメソッドにアクセスすると、「signalSIGABRT」でアプリケーションがクラッシュします。

4

2 に答える 2

1

iOS フレームワークを含む静的ライブラリをネストしないでください。これまで見てきたように、これは大きな問題を引き起こします (2 つのフレームワークがそれぞれ独自のバージョンの 3 つ目のフレームワークを持っている場合は、さらに多くの問題が発生します)。最後のリンク ステップでは、必要なすべてのライブラリをリンクする必要があります。静的ライブラリは、他の静的ライブラリをリンクしてはなりません。これを自動化する本当に良い方法はありません。フレームワークのドキュメントの一部である必要があります。

ただし、フレームワークのリンクに失敗したためにランタイム例外が発生することはありません。シンボルが定義されていないことを示すリンク時のエラーが発生するはずです。クラッシュが発生している場合は、リンクで奇妙なことを行っていることを示しています。

于 2013-01-07T14:21:59.047 に答える
1

問題は、現在ネストされているため、リンカが f2 を f1 にリンクすることですが、f1 が必要とする f2 の部分のみです。

お気に入り

f2 には 5 つのシンボルがあります (f2_1 - 5)
f1 は f2_1 と f2_2 を使用しますが、3,4,5 は使用しません
=> リンカはそれを破棄します

現在、アプリには f2_3、f2_4、および f2_5 が必要ですが、それらはありません...しかし、コンパイル時には誰もそれを知りません。


ここで、アプリを f2 に再度リンクして解決しようとしますが、以前と同じように、コンパイル時にリンカーが f2_3 - 5 を最適化し、それらは f1 にあると想定されるため、重複しています!


この Rob Napier を解決する方法は既に述べました。フレームワークを入れ子にしないでください(主に静的フレームワーク/サード パート フレームワークではありません)。

これを回避するには、f1 が f2 にリンクするときに-all_loadをリンカーに渡します。

于 2013-01-07T16:38:02.563 に答える