【问题标题】:Duplicate symbol issues重复符号问题
【发布时间】:2011-03-15 00:02:23
【问题描述】:

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

ld:在 /path/to/TinCanViewController-E98A666B7AF2673A.o 和 /path/to/TinCanViewController-E98A666B7AF2673A.o 中重复符号 _OBJC_IVAR_$_TinCanViewController.currentViewController

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

00008150 S _OBJC_IVAR__TinCanViewController.currentViewController

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

我觉得我必须以某种方式与该类链接两次,但我非常勤奋地检查并检查了对该类的所有引用。在重构版本中,基本没有。 AppDelegate 包含它,但现在它基本上只是一个在开始时加载另一个 ViewController 的传递类。项目中没有其他类包含它。

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

【问题讨论】:

  • 相同的.m 有两个不同的目标也可能导致此问题。请检查我的答案。

标签: iphone objective-c ipad linker symbols


【解决方案1】:

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

喜欢这个

lib.a - for device.

libCauly-universal.a - for simulator and device.

所以我删除了一个。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      可能,你包括了TinCanViewController.m(应该是TinCanViewController.h

      【讨论】:

      • 谢谢!终于发现我不小心导入了一个.m文件!
      • 我很高兴找到这篇文章。这个问题一直让我发疯,这是一件非常愚蠢的事情。我做了同样的事情.......
      • 我有点不同。尽管 .m 文件在导航器视图中只有一个引用。解决方案是在 Targets -> Build Phases -> Compiled Sources 下有两个对 .m 文件的引用。删除了额外的参考,很好。
      • 哇!你真棒!!它帮助我避免浪费一个小时的时间
      • 非常感谢!节省了我的时间!!不知道为什么 Xcode 的自动完成功能给了我 .m
      【解决方案4】:

      如果您有一个多目标项目并且两个目标具有相同的文件,例如abc.m,并且为两个目标选择了abc.m,也会发生这种情况。

      在我的情况下发生的事情是我有两个名为 ABCXYZ 的目标,它们都有自己的 DiagramViewController.m 文件,它们应该为它们的目标运行代码。我不小心让目标ABCDiagramViewController.m 也为XYZ 选择了目标。

      解决办法:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • Ohhhhhh,这是一个伟大的贡献。我怀疑这实际上是我最初的问题,因为我的解决方案基本上是删除文件并重建它。我敢打赌,这会产生从 .pbxproj 文件中清除文件并只添加一次的副作用。我倾向于将您的答案标记为官方答案,但似乎很多人都遇到了 .m/.h 问题,所以我倾向于将那个问题留在那里。
        • 我遇到了同样的问题,我如何检测到在 Xcode 中打开项目文件并并排查看 git 历史记录,然后才知道它有双重输入!
        【解决方案6】:

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

        祝你好运!!!

        【讨论】:

        • 我没有错误地包含 .m 文件,这是我修复我的方法,谢谢!!
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

          • 这听起来像是一个超级有前途的解决方案(并且可能会帮助其他人),但它似乎并没有为我修复它......我将所有配置设置为 armv7(我正在使用 iPad -only app) 并且我仍然看到错误,即使在 build-clean 之后。我很确定我设置正确 - 这就是我的配置屏幕的样子:web.media.mit.edu/~dharry/configuration-armv7.png 还有其他地方我需要设置它吗?
          • 嗯,这对我来说是正确的。 iPad 可以运行 armv6 - 您可以尝试将其全部设置为 armv6(并禁用“仅构建活动”复选框),看看是否有帮助?它不应该与你所拥有的有任何不同,但它可能值得一试。 FWIW,我必须将我在通用应用程序中使用的静态库构建为仅 armv6,Apple 没有任何问题批准它。
          • 我最终敲掉了有问题的类,让它成功链接,然后从头开始重建类(链接每一步),然后当我终于把所有的部分放回原处并再次将它们连接起来,这很好。神秘。我会测试 armv6 策略,但存储库现在是一个更快乐的状态,我没有心情回到愤怒的无链接阶段。谢谢您的帮助!标记为已回答,因为这似乎是一个很好的通用调试建议,即使我的问题是其他巫毒教。
          • 我删除了所有静态库的所有构建文件夹并重新启动了 Xcode。这解决了我的问题。真的很奇怪。
          猜你喜欢
          • 2017-09-28
          • 1970-01-01
          • 2011-05-23
          • 2023-03-08
          • 2014-06-16
          • 1970-01-01
          • 2020-03-10
          • 2011-09-03
          • 2021-12-22
          相关资源
          最近更新 更多