web-dev-qa-db-ja.com

シンボルの重複の問題

IOSプロジェクトのリファクタリング中に、このバグに遭遇しました。リンクフェーズ中に、次のメッセージが表示されます。

ld:/path/to/TinCanViewController-E98A666B7AF2673A.oおよび/path/to/TinCanViewController-E98A666B7AF2673A.oの重複シンボル_OBJC_IVAR _ $ _ TinCanViewController.currentViewController

私が知る限り、TinCanViewController-E98A666B7AF2673A.oは、指定されたシンボルを2回宣言しています。両方のパスがまったく同じ.oファイルを指している。その特定のファイルでnmを実行しましたが、そのシンボルは一度しか含まれていませんでした。

00008150 S _OBJC_IVAR _ $ _ TinCanViewController.currentViewController

ディレクトリ内の他のすべての.oファイルでnmを実行して、このシンボルも何らかの方法で宣言されているかどうかを確認しましたが、そうではありません。これは、TinCanViewControllerクラスに追加したメンバーに発生します-currentViewControllerに固有のものではありません。

どういうわけかクラスに2回リンクする必要があるように感じますが、このクラスへのすべての参照を熱心に調べ、チェックしました。リファクタリングされたバージョンでは、基本的に何もありません。 AppDelegateにはこれが含まれていますが、現時点では、基本的には最初に別のViewControllerをロードする単なるパススルークラスです。プロジェクト内の他のクラスには含まれていません。

これを引き起こしている可能性のあるもの、またはそれをより良くデバッグする方法についての提案

61
drewww

最新のXcode 4でこの問題が発生しました。原因:file.mの代わりにfile.hを含めました

おそらく、TinCanViewController.mを含めました(TinCanViewController.hである必要があります)

238
Shameem

私はこれを起こしたが、私の問題はレポからのマージの問題に関連していた。 .mファイルは、一度だけリストされるべき場所に2回リストされました(プロジェクト内ではなく、ファイル/グループ構造内ではないため、Xcodeではエラーのみが表示されません)。修正プログラムは、プロジェクトファイル内の.pbxprojファイルを開き、そのファイル内の重複エントリを見つけます。複製を削除した後、プロジェクトは問題なくビルドされました。

31
maxpower

プロジェクトに.hファイルと.mファイルを2回含めました。 2番目のコピーを削除すると、エラーはなくなりました。

5
Ram

Compile-Sources内でdelegate.mが一度だけリストされるようにしてください。

4
Muhammad Irfan

この問題は、クラスフォルダーからすべてのファイル.mおよび.hを(Xcodeを使用して)削除してからProject(Command + Shift + K)をクリーンアップし、再度ビルドしたときに解決します。そのため、ファイルをFinderからXcodeのClass Folderに再度ドラッグします。最後に、プロジェクトを再度クリーンアップしてビルドします...

幸運を !!!

3
Rafael Reis

これは、ユニバーサルスタティックライブラリを作成する際のAppleの最新のリンカーのバグだと思います。現在、バグ番号を見つけることはできませんが、これは、あいまいさを明確にせずにarmv6とarmv7を誤って生成するために発生します。

これが事実かどうかを確認するには、構成を変更してarmv6またはamv7のみをビルドします。この問題は発生しません。

1
psychotik

これは、マルチターゲットプロジェクトがあり、2つのターゲットがabc.mなどの同じファイルを持ち、両方のターゲットに対してabc.mが選択されている場合にも発生する可能性があります。

私のケースで起こったことは、ABCXYZという名前の2つのターゲットがあり、両方ともターゲットのコードを実行することになっている独自のDiagramViewController.mファイルを持っていたことです。ターゲットABCDiagramViewController.mも誤ってXYZにターゲットが選択されていました。

解決 :

.mファイルをクリックして、ファイルインスペクターに移動し、追加のターゲットの選択を解除します。

enter image description here

0
rohan-patel