2017-04-19 9 views
0

私のアプリケーションでサードパーティのフレームワークを使用する必要があります。私は私のプロジェクトにフレームワークが含まれている場合しかし、私は次のようなリンカエラーを取得:iOSフレームワークのシンボルが重複する

duplicate symbol _SRHTTPResponseErrorKey in: 
    Shared/Libraries/XXX.framework/XXXSDK(SRWebSocket.o) 
    Shared/Libraries/YYY.framework/YYYSDK(YYYSRWebSocket.o) 

フレームワーク(複数可)を変更することなく、このようなエラーを解決する方法はありますか?

答えて

2

問題は、フレームワークとあなたのコード(またはあなたのフレームワークの他のもの)が同じクラス/フレームワークを含んでいるということです。フレームワークの開発者は、自身のフレームワークを他のフレームワークの傘にすることは良いアイデアだと考えました。そうではありません。フレームワークは決して別のものを含むべきではありません。

BTW:ObjectiveCフレームワークのすべてのクラスにプレフィックスを付ける必要があります。それは紛争の可能性を低下させます。

あなたのために以下の解決方法があります。

  1. あなたが相反する2つのクラスの1を追加した場合:あなたのコード内のクラスの名前を変更します。多分、フレームワークをフォークし、すべてのクラスのプレフィックスを変更するか、3)の技術でラッパーフレームワークを作成します。

  2. すべての外部コードを削除してリンクするように開発者に依頼してください。さらに、依存関係を文書化して、フレームワークのユーザーが、どのバージョンの追加する必要があるかを知る必要があります。依存するフレームワークを取得するよりも、CocoaPods/Carthageやmakefileなどの依存関係フレームワークを使用することができます。

  3. 2)フレームワークが他の顧客によって使用され、開発者がコードを破ることができない場合(2):フレームワークの開発者に、彼らはおそらくクラスの名前を変更しhere

+0

説明のように、自分のコード「その他のCフラグが」ではありません( 'SRWebSocket'、問題の' YYYSRWebSocket'を参照してください)。彼らはおそらくいくつか一定していなかったでしょう。しかし、欠落しているシンボルが1つあれば問題はあります...おそらく、フレームワークに既に含まれているので、クラスからシンボルを削除すれば十分でしょう。 – Sulthan

+0

はい、あなたはそうです:) – ObjectAlchemist

+0

ちなみに、別のフレームワークの中にフレームワークを含める理由は、例えば、あなたのcocoapodにコンパイルされたコードとフレームワークを持つ静的ライブラリが含まれている場合などです。私はGoogle Analyticsがそれをやっていると信じています。 – Sulthan

関連する問題