web-dev-qa-db-ja.com

クラス 'Foo'の重複するインターフェイス宣言

プログラムに取り組んでいたのですが、設定が変わったようです。突然、「クラス 'Foo'のインターフェイス宣言が重複しています」というエラーが発生しました。ヘッダーファイルが複製されていると記載されていますが、コピーは1つだけです。

興味深いことに、これはデバッグモードでのみ発生し、デバイスモードでは発生しません。

誰かが何が間違っているのか考えていますか?

私はObjective-C++といくつかの静的ライブラリを使用しています。

18
John Smith

私は問題を見つけました。ヘッダーファイルのコピーが2つあり、XCodeが混乱しました。

謎は、XCodeがこれらのファイルを単独でコピーすることをどのように決定したかです...

9
John Smith

私はまったく同じ問題を抱えていました。ヘッダーのコピーが2つあり、xcodeでヘッダーへの参照を削除して古いヘッダーを削除しました。その場合、プロジェクトナビゲーターの新しいヘッダーファイルを指すヘッダーの参照は1つだけでした。

ファイルシステムから古いヘッダーを実際に削除した後、問題は解決しました。

Xcodeのバグである可能性があります。ファイルへの参照を削除しても、参照の一部がプロジェクトファイルに残っている場合があります。

17
RohinNZ

このエラーメッセージが表示されますが、ヘッダーが重複していないか、インポートが重複していません。問題は、ヘッダーファイルの名前を変更し、Xcodeが何らかの方法でそれらをキャッシュしたままにしているため、ビルドエラーが発生することです。

これを修正するために次のことを行いました。すでに他の答えを試してもエラーが発生する人に役立つことを願っています。

  1. クリーンなプロジェクト
  2. 「派生データ」を削除します([オーガナイザー]> [プロジェクト]タブで、プロジェクトを選択し、[削除]をクリックします)
  3. Xcodeを再起動します
  4. ビルド
14
Andy

同様の問題が発生しましたが、ソースファイルのコピーが2つありませんでした。私の場合、次のような状況になりました。

クラスAは上記のエラーを出し、クラスBはクラスAのタイプを使用するプロパティを持っていました。

問題は、クラスBで、.hファイルと.mファイルの両方で#import「クラスA」を呼び出したことです。私の場合、これが上記の問題を引き起こしました。これが誰かに役立つことを願っています。

5
Guy

すべてのファイルヘッダーで「#include」から「#import」に変更したところ、問題は解決しました。ファイルを「#include」するときは、複数のインクルードに対する独自のガードを作成する必要があると思いますが、「#import」を使用するときは、XCodeがそれを処理します。

2
RoyGal

このエラーは、異なるオブジェクトに同じ変数名を付けるために発生します。これは、Xcode7.0の後に発生するエラーです。したがって、この問題を解決するには、ビルド設定に移動を検索し、共通ブロックなしを検索して設定します[〜#〜] no [〜#〜] =。

また、再度ビルドしても、このエラーは発生しません。

CheersKP

2

また、さまざまな自己作成静的ライブラリを使用してワークスペースをアーカイブしているときに、この正確な問題が発生しました。プロジェクトは正常にビルドされ、シミュレーターで実行されますが、アドホックテスト用にビルドを「アーカイブ」しようとすると、これらの重複するインターフェイス定義エラーが発生します。解決策は、「ヘッダーのコピー」フェーズがパブリック/プロジェクト/プライベートヘッダーを正しく示していることを確認することでした。 'project'に誤って設定されたヘッダーファイルが1つありました。 'public'である必要があり、その後、アーカイブは正常に作成されました。

1
TPoschel

私にとって、この問題は、Cocoapodsでuse_frameworks!に移行したときに発生しました。メソッドを拡張するために使用した便利なクラスで、FBSDKCoreKitからヘッダーをインポートしていました。これは、フレームワークの使用に切り替えるまでは問題ありませんでしたが、ローカルインクルード(#import "FBSDKAccessToken.h")を使用することはできなくなりました。グローバルインクルード(#import <FBSDKCoreKit/FBSDKAccessToken.h>)に切り替える必要がありました。 この記事 ブリッジファイルにヘッダーを含めない理由を説明することで、私は正しい方向を示しました。

1
Scott Fister

私の問題は次のとおりでした。プロジェクトにポップアニメーションフレームワークを追加しましたが、xcworkspaceの代わりにxcodeprojを使用しました。構成後、pop-iso-frameworkターゲットを構築できましたが、アプリターゲットを構築できませんでした。後で、Xcodeがポップクラスをビルドフェーズ->アプリターゲットのソースのコンパイルに追加したことに気付きました。そこからすべてのポップクラスを削除すると、問題が修正されました。

1
Josip B.

フレームワークの構築にも同じ問題がありました。 「前の定義はここにあります」エラーは、元の「クラスのインターフェイス定義が重複しています」エラーとまったく同じヘッダーファイルと行番号を示していました。上記のいずれも機能せず、コードにエラーはありませんでした。関係するヘッダーをSpotlightで検索したところ、2つのコピーが表示されました。1つは期待したもので、もう1つはbuild/Debug-iphonesimulator/includeにあります。クリーンアップを行ってから、ビルドディレクトリを手動で削除しました。問題はなくなりました。

0
Michael Domino

それぞれ異なるターゲットに2つのバージョンのA.hA.mファイルを使用すると、この問題が発生しました。そこで、2つのフォルダー(物理ディレクトリ)を作成し、それぞれのA.hとA.mを別々のフォルダーに保存しました。次に、必要なターゲットにフォルダーを追加しました。私のために問題を解決しました。

少し文脈から外れていますが、役立つかもしれません。 !!

0
NaXir

私の場合、問題は別のプロジェクトからファイルを取り込んで再利用することに起因していました。コピーダイアログボックスで「必要に応じてファイルをコピーする」ことに注意を払わず、新しいプロジェクトで新しいコピーを作成する代わりに、元のプロジェクトのファイルを参照しました。参照を削除してファイルを正しく再コピーしたら、すべて問題ありませんでした。

0
Casey Perkins

同じ問題があり、project.pbxprojファイルにclass.mファイルが多すぎるようでした。

万が一に備えて、編集する前に必ずそのファイルをバックアップしてください。

0
Tim