web-dev-qa-db-ja.com

クラスは両方に実装されています。 2つのうちの1つが使用されます

SocketRocketを使用して依存関係(CocoaPods経由でインストール)を持つプロジェクトがあり、HeapAnalyticsから静的ライブラリをインポートしました。どうやら、HeapAnalyticsライブラリは既にSocketRocketを使用しています。コンパイル時にエラーは発生しませんが、実行時に次を受け取ります。

Class SRWebSocket is implemented in both [path] and [path].
One of the two will be used. Which one is undefined.

私が見たほとんどのソリューションは静的ライブラリを自分でコンパイルする必要があり、クラス名などを変更する必要があり、ソースにアクセスできないため、どのように処理するのかわかりません。

推奨事項はありますか?

36
MrGrinst

そのエラーメッセージを書きました!•

クラス名を変更するか、前述のライブラリにリンクしないでください。

プロジェクトはどのように構成されていますか? SRに明示的にリンクする場所はどこにありますか?それとも、すでにSRが含まれている2つの静的ライブラリに対するリンクの製品ですか?

前者の場合は、SRへの直接リンクを停止し、既に使用しているライブラリに付属しているバージョンを継承します(警告:適切なバージョンであることを確認してください)。

後者の場合、ライブラリの1つを変更する必要があります。

•実際、エラーを修正しました。以前は、どちらか一方が使用されることを暗示していました。しかし、それは実際に起こっていたことではなく、動作はプラットフォームごとに異なっていました。したがって、動作が定義されていないことを特定する際により正確になるように変更されました。

47
bbum

概要:

このエラーは、同じシンボル/クラスが2回定義されていることを示しています。

解決:

  • リンクされているフレームワークをチェックして、重複があるかどうかを確認します。その場合、重複を削除します
  • ビルドフォルダーのクリーンアップ(Command + Shift + K)
  • シミュレーターの場合は、シミュレーターをリセットして試してください
  • デバイスの場合は、デバイスを再起動して試してください

私の経験:

同じ問題に2度直面しました。フレームワークが重複し、シミュレータをリセットするのに役立ちました。

2
user1046037

私の場合、メインアプリのターゲットとテストターゲットの両方に不必要にソースファイルを追加すると、このエラーが発生しました。

Target Membership with both targets selected

Target Membershipからテストターゲットを削除すると解決しました。

Target Membership with only one target selected

2
Goodsquirrel

この警告が1か月以上続いた後、ようやくこれを試したところ、うまくいきました。

  1. リセットシミュレータ(メニュー:ハードウェア->すべてのコンテンツと設定を消去...)
  2. クリーンプロジェクト(Command + Shift + K)
  3. クリーン the build folder(Command + Option + Shift + K)
  4. 実行シミュレーターのコードを再度
1
LukeSideWalker