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

10

我试图在Swift中使用RFDuino Objective-C库。听起来很简单,我以前从Swift类中调用了Objective-C,没有问题。但这一次我遇到了困难。

我创建了头文件,并将头文件添加到其中。Swift可以毫无问题地看到这些类。项目编译也没有问题。

然而,在我尝试调用任何Objective类之后,问题就在构建过程中出现了。

例如:

    override func viewDidLoad() {
         super.viewDidLoad()

        let rfDuinoManager: RFduinoManager = RFduinoManager.sharedRFduinoManager()

}

未定义符号的架构为x86_64: 在ViewController.o中引用了"_OBJC_CLASS_$_RFduinoManager", ld: 找不到符号的架构为x86_64 clang: 错误:链接器命令失败,退出代码为1(使用-v查看调用)

enter image description here

我不确定我错过了什么。 项目链接在这里。 https://www.dropbox.com/s/rza1ce01g4q5lp6/SmartHomeHub-stackoverflow.zip?dl=0

提前感谢您的帮助。老实说,我现在正在失去希望,正在考虑重写整个库以Swift。

4个回答

17
问题在于rfduino文件夹是如何添加到项目中的。因此:
  1. 删除 rfduino 文件夹(在左侧项目导航面板中选择rfduino文件夹,然后点击删除按钮,当它询问是否将其移动到垃圾桶或仅删除引用时,选择“删除引用”)。

    enter image description here

  2. 你的桥接头文件有绝对路径引用,我建议在构建设置中选择它,然后点击删除按钮彻底删除:

    enter image description here

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

    enter image description here

    还要确保下面选中了 SmartHomeHub

  4. 如果您正确执行了上述步骤,它将自动提示您创建桥接头文件:

    enter image description here

  5. 进入这个新的桥接头文件,再次添加您的导入行:

    enter image description here


哇,太棒了,非常详细 :) 谢谢 - Greg Lukosek

5
这是一个链接错误,而不是编译器错误。您确定RFduino类(源码或库)已包含在您的项目中吗?(在Xcode中打开项目成员面板,并确保选中复选框以包括库到目标)。
如果已经包含,请确保它已经编译 x86_64 代码。它可能是一个 iOS 库,并且只编译为 ARM。通过找到二进制文件并从命令行运行 lipo 来进行检查。 lipo -info [RFduinolibrary.a(dylib,whatever) 的名称] 它应该显示 x86_64 作为一种体系结构,如下所示: 文件中的体系结构是:i386 x86_64

谢谢,是这样的!我已经导入了整个库文件夹。我确实检查了文件夹是否包含,但没有检查文件!谢谢 - Greg Lukosek

1
"

\"enter"“OPN [Debug]目标覆盖了OTHER_LDFLAGS构建设置”。这是主要问题。在其他链接器标志中添加$(inherited)解决了我的问题。

"

0

对我来说,删除“派生目录”中的所有文件,删除项目中的框架引用并重新连接等操作都不再起作用了。唯一有效的方法是将“仅编译活动架构”设置为“是”。


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