首页 文章

从Swift类调用Objective-C导致链接器错误

提问于
浏览
8

我正在尝试在Swift中使用RFDuino Objective-C库 . 这听起来很简单,我之前从Swift类中调用过Objective-C,没问题 . 然而这次我撞到了砖墙 .

创建的头文件 . 添加了头文件 . Swift可以看到类没问题 . 项目编译好 .

构建过程中的问题出现在我尝试调用任何Objective类之后

例如:

override func viewDidLoad() {
         super.viewDidLoad()

        let rfDuinoManager: RFduinoManager = RFduinoManager.sharedRFduinoManager()

}

体系结构x86_64的未定义符号:“_ OBJC_CLASS _ $ _ RFduinoManager”,引自:ViewController.o中的__TMaCSo14RFduinoManager ld:未找到体系结构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

我不知道我在这里失踪了什么 . 链接到这里的项目 . https://www.dropbox.com/s/rza1ce01g4q5lp6/SmartHomeHub-stackoverflow.zip?dl=0

在此先感谢您的帮助 . 老实说现在失去了希望并考虑将整个库重写为Swift

3 回答

  • 15

    这是链接器错误,而不是编译器错误 . 您确定RFduino类(源或库)包含在您的项目中(打开Xcode右侧的项目成员资格面板,并确保选中此框以在目标中包含该库) .

    如果包含它,请确保已将x86_64代码编译到其中 . 它可能是一个iOS库,只是为ARM编译 . 您可以通过查找二进制文件并从命令行运行 lipo 来进行检查 .

    lipo -info [name of RFduinolibrary.a(dylib,whatever)]

    它应该将x86_64显示为架构,ala:

    Architectures in the file are: i386 x86_64

  • 4

    问题是如何将rfduino文件夹添加到项目中 . 所以

    • 删除 rfduino 文件夹(在左侧的项目导航器面板中选择rfduino文件夹并点击删除按钮,但当它要求将其移动到废纸篓或只是删除引用时,请选择"remove references" .

    • 您的桥接头有一个绝对路径引用,我建议通过在构建设置中选择它并按下删除按钮来完全删除它:

    • 将rfduino文件重新添加回项目,这次,在“添加文件夹”选项下,选择“创建组”而不是“创建文件夹引用” . 如果您希望它为您提示创建适当的桥接 Headers ,请不要选择文件夹,而是选择单个文件:

    还要确保在下面选中 SmartHomeHub .

    • 如果您正确执行此操作,它将要求您自动创建桥接标头:

    • 转到此新的桥接 Headers 并再次添加导入行:

  • 1

    "The OPN [Debug] target overrides the OTHER_LDFLAGS build setting" . 这是主要问题 . 在其他链接器标志的新行中添加$(继承)解决了我的问题 .

相关问题