且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Xcode 构建失败“架构 x86_64 的未定义符号"

更新时间:2023-01-02 09:15:14

您的项目中似乎缺少 IOBluetooth.framework.您可以通过以下方式添加:

  • 点击左窗格左上角的项目(蓝色图标).

  • 在中间窗格中,单击构建阶段"选项卡.

  • 在Link Binary With Libraries"下,点击加号按钮.

  • 从列表中找到 IOBluetooth.framework 并点击添加.

这将确保链接器找到 IOBluetooth.framework 定义.您可以通过单击左窗格中的框架并在右窗格中查看框架的目标成员身份来看到该框架是目标的成员(请注意,出于组织目的,我已将该框架移至 Frameworks 组下):>

An Xcode beginner's question:

It is my first experience with Xcode 4.6.3.

I am trying to write a very simple console program, that searches for paired BT devices and prints them to an NSLog.

It builds with the following error:

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)

I searched like crazy. The common problem should be a reference to a file, of which only the header files are imported and no implementation (*.m-file) is found by the linker. The IOBluetooth library is however, a standard Framework like the Foundation Framework.

What am I missing in my above statement?

I also have tried building it for a 32-bit machine (build fails again). It is clearly a linker error, however I have no idea, to what it relates, except that there is an issue with finding the implementation for IOBluetoothDevice, on both x86 and x64 architecture, while the header files are from a standard included Framework, called IOBluetooth?

For your information my main code "main.m" being:

#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;
}

Thanks for any help or pointers to the right direction.

It looks like you are missing including the IOBluetooth.framework in your project. You can add it by:

  • Clicking on your project in the upper left of the left pane (the blue icon).

  • In the middle pane, click on the Build Phases tab.

  • Under "Link Binary With Libraries", click on the plus button.

  • Find the IOBluetooth.framework from the list and hit Add.

This will make sure that the IOBluetooth.framework definitions are found by the linker. You can see that the framework is a member of your target by clicking on the framework in the left pane and seeing the framework's target membership in the right pane (note I've moved the framework under the Frameworks group for organization purposes):