一个Xcode初学者的问题:

这是我第一次使用Xcode 4.6.3。

我试图写一个非常简单的控制台程序,搜索配对的BT设备,并将它们打印到NSLog。

它会生成以下错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我疯狂地搜索。常见的问题应该是对文件的引用,其中只有头文件被导入,链接器没有找到任何实现(*.m-file)。IOBluetooth库是一个标准框架,就像基础框架一样。

我在上面的陈述中遗漏了什么?

我还尝试为32位机器构建它(构建再次失败)。这显然是一个链接器错误,但我不知道,它与什么有关,除了有一个问题,找到IOBluetoothDevice的实现,在x86和x64架构上,而头文件是从一个标准包含的框架,称为IOBluetooth?

供你参考,我的主要代码是main。m”:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

谢谢你的任何帮助或指点正确的方向。


当前回答

看起来您在项目中缺少包含ioblutooth .framework。您可以通过以下方式添加:

单击左窗格左上方的项目(蓝色图标)。 在中间窗格中,单击Build Phases选项卡。 在“Link Binary With Libraries”下,点击加号按钮。 从列表中找到ioblutooth .framework,然后点击Add。

这将确保ioblutooth .framework定义被链接器找到。您可以通过单击左侧窗格中的框架,并在右侧窗格中看到该框架的目标成员,从而看到该框架是目标成员(注意,出于组织目的,我已经将该框架移动到Frameworks组下):

其他回答

当更新到Xcode 7.1时,你可能会看到这种类型的错误,它不能通过上述任何答案来解决。在我的案例中,其中一个症状是应用程序在设备上而不是在模拟器中运行。您可能会看到大量与您正在使用的几乎所有框架相关的错误。

解决方法其实很简单。你只需要从“框架搜索路径”设置中删除一个条目,在你的TARGETS > Build Settings > Search Paths部分中找到(确保“All”选项卡被选中)

如果您在这里看到主目标或测试目标的另一个条目(除了$(inherited)之外),只需从所有目标中删除错误路径并重新构建。

这也发生在苹果M1芯片上。

这是我的解决方案,使用罗塞塔检查打开 步骤:

转到应用程序>右击xcode >获取信息>检查使用Rosetta打开 重新启动系统。

我也在Xcode 7.2上看到过这个错误,当派生数据被损坏时(在我的情况下,我中断了一个构建,怀疑这是根本原因)。

因此,如果其他解决方案(特别是克里斯的和BraveS的,我怀疑更有可能)不适合你的问题,尝试删除派生数据(选择:窗口/项目/派生数据->删除)并重新构建。

(补充供他人参考-我知道原来的问题已经正确回答)。

帮助我的是在抛出错误的项目中向我的/podspec添加s.static_framework = true。

看起来您在项目中缺少包含ioblutooth .framework。您可以通过以下方式添加:

单击左窗格左上方的项目(蓝色图标)。 在中间窗格中,单击Build Phases选项卡。 在“Link Binary With Libraries”下,点击加号按钮。 从列表中找到ioblutooth .framework,然后点击Add。

这将确保ioblutooth .framework定义被链接器找到。您可以通过单击左侧窗格中的框架,并在右侧窗格中看到该框架的目标成员,从而看到该框架是目标成员(注意,出于组织目的,我已经将该框架移动到Frameworks组下):