2013-12-18 23 views
8

私は、別の会社によって作成された静的ライブラリを含むiOSプロジェクトで作業しています。 ライブラリには旧バージョンのAFNeworkingが含まれており、ソースファイルはありません。同じライブラリの2つのバージョンを使用する

私はもっと最近の(そしてあまり盗難されない)バージョンのafneworkingを使う必要がありますが、すべての "重複するシンボル"のために同じクラスをプロジェクトに2度入れることはできません。

ライブラリに含まれているバージョンを置き換えることは不可能だと思いますが、古いバージョンに別のバージョンを含めるにはどうすればよいですか?

私のプロジェクトに組み込む前にフレームワーク全体をリファクタリングする方法はありますか?

ありがとうございました

+0

ねえ...どうやってこれを解決しましたか?私は同じ問題を抱えています –

+1

私は申し訳ありませんが、いくつかの後にトロイの木馬の解決策(それは動作しますが、少し危険なと非常にトリッキーです)私は私の上司に元のソースコードを要求するように頼む – TheObjCGuy

答えて

3

埋め込みAFNetworkingファイルを削除するには、静的ライブラリを再パッケージする必要があります。

開梱と図書館:AFNetworkingオブジェクトファイルを除くすべてのファイルを含む

$ ar x libwhatever.a 

、再パッケージ化、:

$ ar cr libwhatever.a file1.o ... fileN.o 

あなたは、新しいAFNetworkingを使用して実行可能ファイルをリンクする必要があります静的ライブラリであり、libwhatever.aのコードを破るAPIの変更がないことを願っています。あなたがすることができることがたくさんあると疑うならば。

+1

これは*働くかもしれませんしかし、それはコンパイル時にリンクされているバージョンと今のところそれをリンクしているバージョンの間で変化しないABIに依存しています。あなたがポイントバージョン以上の移動をしているなら、これはうまくいくとは思わないでしょう。 –

+0

@MichaelMelanson ** ABI **変化していますか?それは決して変わらない。 – trojanfoe

+1

これは危険で、この改行を行うような変更が容易に発生する可能性があります。 – Gavin

3

これは簡単ではありません。同じフレームワークの別々の2つのバージョンと同時にリンクすることができる環境はごくわずかですが、Xcode/iOSはその1つではありません。

私はそれを見ると、あなたは3つのオプションがあります。自分のライブラリーに対する

1)をリンクし、彼らが使用AFNetworkingの同じバージョンを使用しています。

2)ライブラリとリンクし、手動でAFNetworkingの新しいバージョンを読み込み、そこからシンボルを引き出します。注意してください:これは醜い速くなり、将来のメンテナーはあなたが何を喫煙しているのだろうかと思います。

3)ライブラリを更新してください。

ここでの状況はわかりませんが、一般的にはソースを提供する必要があります。静的な(静的な)ライブラリのみを提供し、内部で何が行われているかを知る方法はありません。彼らの利益を守るために、ソフトウェアライセンス契約書などに署名する必要があります。

2

これを処理する最も適切な方法は、静的ライブラリの作成者に連絡して状況を解決することです。 AFNetworkingの埋め込みバージョンを更新したり、AFNetworkingへの依存を取り除いたり、AFNetworkingの埋め込みコピーの接頭辞を追加することで解決できます。第三者図書館が別の図書館を組み込んでいる場合、最後の図書館はおそらく良い考えです。そうしないと、同じサードパーティー図書館を2つ同時に含む2つの図書館を同時に使用することができなくなるからです。

AFNetworkingのコピーをリファクタリングして、クラスの名前を変更してプレフィックスを付けることもできますが、これは静的ライブラリのベンダーがこれを既に行っている必要があるため、不要です。

最後に、現在のものと同じものを実現する別のライブラリが見つかりましたが、AFNetworkingは埋め込まれていません。

関連する問題