重复的符号问题

时间:2010-07-12 20:22:02

标签: iphone objective-c ipad linker symbols

在iOS项目的重构过程中,我碰到了这个bug。在链接阶段,我收到此消息:

  

ld:/ path/to/TinCanViewController-E98A666B7AF2673A.o和/path/to/TinCanViewController-E98A666B7AF2673A.o中的重复符号_OBJC_IVAR _ $ _ TinCanViewController.currentViewController

据我所知,看起来声称TinCanViewController-E98A666B7AF2673A.o声明指定的符号两次;两个路径都指向完全相同的.o文件。我在该特定文件上运行了nm,它只包含该符号一次:

  <00> 00008150 S _OBJC_IVAR _ $ _ TinCanViewController.currentViewController

我在目录中的所有其他.o文件上运行nm以查看它们是否以某种方式声明了此符号,但它们不是。这种情况发生在我添加到TinCanViewController类的任何成员中 - 它不是特定于currentViewController。

我觉得我必须以某种方式以某种方式与班级联系两次,但我非常刻苦地检查了所有对这门课程的引用。在重构版本中,基本上没有。 AppDelegate包含它,但是现在它基本上只是一个直通类,它在开始时加载另一个ViewController。项目中没有其他课程包括它。

有关可能导致此问题的原因或我如何更好地调试它的任何建议?

8 个答案:

答案 0 :(得分:236)

我在最新的Xcode 4上遇到了这个问题。原因:我添加了file.m而不是file.h

可能包括TinCanViewController.m(应为TinCanViewController.h

答案 1 :(得分:31)

我发生了这种情况,但我的问题与我们的回购合并问题有关。 .m文件在一个位置列出两次,它应该只列出一次(在项目中,但不在文件/组结构中,因此您无法在Xcode中看到问题,只有错误)。修复程序是在项目文件中打开.pbxproj文件并在该文件中查找重复条目。删除副本后,项目构建得很好。

答案 2 :(得分:5)

我碰巧在项目中包含.h文件和.m文件两次。一旦我删除了第二个副本,错误就消失了。

答案 3 :(得分:4)

确保delegate.m仅在Compile-Sources中列出一次。

答案 4 :(得分:3)

当我从Class文件夹中删除(使用Xcode)所有文件.m和.h然后我再次清理Project(Command + Shift + K)和Builded时,此问题解决了。所以我再次将文件从Finder拖到Xcode中的Class Folder。最后,我再次清理并构建我的项目......

祝你好运!!!

答案 5 :(得分:1)

我认为在创建通用静态库时,这是Apple最新链接器的错误。我现在无法找到错误编号,但这是因为它错误地生成了armv6和armv7而没有消除它们的歧义。

要验证是否是这种情况,请将配置更改为仅构建armv6或amv7,并且不会出现此问题。

答案 6 :(得分:0)

如果你有一个多目标项目,并且两个目标有abc.m这样的文件,并且两个目标都选择了abc.m,也会发生这种情况。

在我的案例中发生的事情是我有两个名为ABCXYZ的目标,并且都有自己的DiagramViewController.m文件,这些文件应该为其目标运行代码。我意外地DiagramViewController.m目标ABC已为XYZ选择了目标。

解决方案:

单击.m文件转到文件检查器并取消选择其他目标。

enter image description here

答案 7 :(得分:-1)

我有同样的问题。问题是我有两个包含相同.m文件的库。

像这样

lib.a - for device.

libCauly-universal.a - for simulator and device.

所以我删了一个。