Xcode 6.1中的Mach-O链接器错误

3
我在Xcode 6.1中遇到了以下链接器错误,而在Xcode 6.01中则没有问题:
Undefined symbols for architecture x86_64:
  "__TWvdvC7Bamberg18TourViewController2mmT_", referenced from:
      __TFC7Bamberg18TourViewControllerm2mmT_ in tours.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我已经了解了标准建议,尝试了无数方法:

  • 清理项目和构建文件夹
  • 删除组织者和开发人员文件夹中的派生数据
  • 从模拟器和设备中删除应用程序的先前版本
  • 重置模拟器
  • 将"仅构建活动架构"设置为Yes/No
  • 玩弄编译器和架构设置
  • 添加每一个可以想象到的框架(包括添加所有框架)
  • 确保所有实现文件都包含在"Compile Sources"中
  • 我甚至重新创建了整个项目在XCode 6.1,以确保不是一些隐藏的错误派生数据问题

最后,我成功地将问题源头指向了一个被导入的Objective C类,它已经被很好地桥接 - 当我不使用这个类时,错误就消失了:https://github.com/mrcrow/MRoundedButton

如果我直接在6.1中打开该类的演示项目,它能够正常工作。所以我认为这必须是该类与我的具体代码冲突或该类与Swift代码在一般情况下的桥接错误。

非常感谢任何帮助。


你在Target >> Build Settings >> Architecture中设置了什么配置? - raurora
标准架构(armv7,arm64) - hoshy
你是直接使用 MRoundedButton.hMRoundedButton.m 两个类,还是通过 Cocoa Pods 引入的? - raurora
我直接使用它们。 - hoshy
1个回答

1
你的 Swift 代码可能存在问题,或者触发了 Swift 编译器的一个 Bug。链接器报错的符号是 Swift 符号(以 __T 前缀标识)。通过传递这些符号给 swift-demangle 工具,可以将其翻译为:
_TFC7Bamberg18TourViewControllerm2mmT_ ---> Bamberg.TourViewController.mm.materializeForSet : ()
_TWvdvC7Bamberg18TourViewController2mmT_ ---> direct field offset for Bamberg.TourViewController.mm : ()

在您的TourViewController中,似乎引用了一个名为mm的字段,但链接器找不到它。也许您可以重写/重新组织代码来避免/解决这个问题。

很奇怪,因为如果我不使用上述的ObjC类,Swift TourViewController 就可以正常工作。但是我还是会尝试改变一些东西。谢谢。 - hoshy
没关系,你说得完全正确。我必须在方法内部声明mm(它是一个字典),而不是全局声明。不知道为什么,但现在它可以工作了。非常感谢你让我找到正确的方向。 - hoshy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接