在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。项目中没有其他课程包括它。
有关可能导致此问题的原因或我如何更好地调试它的任何建议?
答案 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
,也会发生这种情况。
在我的案例中发生的事情是我有两个名为ABC
和XYZ
的目标,并且都有自己的DiagramViewController.m
文件,这些文件应该为其目标运行代码。我意外地DiagramViewController.m
目标ABC
已为XYZ
选择了目标。
单击.m
文件转到文件检查器并取消选择其他目标。
答案 7 :(得分:-1)
我有同样的问题。问题是我有两个包含相同.m文件的库。
像这样lib.a - for device.
libCauly-universal.a - for simulator and device.
所以我删了一个。