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をロードする単なるパススルークラスです。プロジェクト内の他のクラスには含まれていません。
これを引き起こしている可能性のあるもの、またはそれをより良くデバッグする方法についての提案
最新のXcode 4でこの問題が発生しました。原因:file.m
の代わりにfile.h
を含めました
おそらく、TinCanViewController.m
を含めました(TinCanViewController.h
である必要があります)
私はこれを起こしたが、私の問題はレポからのマージの問題に関連していた。 .mファイルは、一度だけリストされるべき場所に2回リストされました(プロジェクト内ではなく、ファイル/グループ構造内ではないため、Xcodeではエラーのみが表示されません)。修正プログラムは、プロジェクトファイル内の.pbxprojファイルを開き、そのファイル内の重複エントリを見つけます。複製を削除した後、プロジェクトは問題なくビルドされました。
プロジェクトに.hファイルと.mファイルを2回含めました。 2番目のコピーを削除すると、エラーはなくなりました。
Compile-Sources内でdelegate.mが一度だけリストされるようにしてください。
この問題は、クラスフォルダーからすべてのファイル.mおよび.hを(Xcodeを使用して)削除してからProject(Command + Shift + K)をクリーンアップし、再度ビルドしたときに解決します。そのため、ファイルをFinderからXcodeのClass Folderに再度ドラッグします。最後に、プロジェクトを再度クリーンアップしてビルドします...
幸運を !!!
これは、ユニバーサルスタティックライブラリを作成する際のAppleの最新のリンカーのバグだと思います。現在、バグ番号を見つけることはできませんが、これは、あいまいさを明確にせずにarmv6とarmv7を誤って生成するために発生します。
これが事実かどうかを確認するには、構成を変更してarmv6またはamv7のみをビルドします。この問題は発生しません。
これは、マルチターゲットプロジェクトがあり、2つのターゲットがabc.m
などの同じファイルを持ち、両方のターゲットに対してabc.m
が選択されている場合にも発生する可能性があります。
私のケースで起こったことは、ABC
とXYZ
という名前の2つのターゲットがあり、両方ともターゲットのコードを実行することになっている独自のDiagramViewController.m
ファイルを持っていたことです。ターゲットABC
のDiagramViewController.m
も誤ってXYZ
にターゲットが選択されていました。
.m
ファイルをクリックして、ファイルインスペクターに移動し、追加のターゲットの選択を解除します。