一个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;
}

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


当前回答

这可能会帮助到某些人。我花了好几天才想明白。我在OBJ-C工作,我去了:

编译源代码并添加新的VC。m文件。

我正在使用遗留代码,我通常是一个敏捷的新手,所以我甚至没有想过将我的.m文件导入到源代码库中。

编辑:

第二次遇到这个问题,结果就不一样了。这个答案在5个小时的调试之后拯救了我。尝试了这个线程上的所有选项。https://stackoverflow.com/a/13625967/7842175如果这对你有帮助,请给他信用,但基本上你可能需要在文件检查器中将你的文件设置为目标。

总而言之,这是一个非常模糊的错误代码,可能是由很多原因引起的,所以继续尝试不同的选项。

其他回答

我也犯了同样的错误,因为我没有删除文件,而是删除了对该文件的引用。在Finder中定位文件并删除它会有所帮助。

我知道这是一个老问题,但今天得到了同样的错误,上述解决方案都无效。

通过设置选项来修复它:

Project -> Architecture -> Build Active Architecture Only

为Yes

正确地编译和构建项目

我在这里尝试了几乎所有的东西,但我的问题原来是以前的cocoapods构建的残余。对我有用的是:

rm -Rf Pods;圆荚体安装 删除派生数据(窗口/项目…选择你的目标。点击删除按钮) 重建

在我的情况下,删除选择的目标成员,然后再次选择修复问题。

查看William Cerniuk的答案和附件照片。

If you're getting this error when trying to link to a C file, first double check the function names for typos. Next double check that you are not trying to call a C function from a C++ / Objective-C++ environment without using the extern C {} construct. I was tearing my hair out because I had a class that was in a .mm file which was trying to call C functions. It doesn't work because in C++, the symbols are mangled. You can actually see the concrete symbols generated using the nm tool. Terminal to the path of the .o files, and run nm -g on the file that is calling the symbol and the one that should have the symbol, and you should see if they match up or not, which can provide clues for the error.

nm -g file.o

你可以这样检查c++符号:

nm -gC file.o