1. ホーム
  2. objective-c

[解決済み】Xcodeのビルド失敗 "アーキテクチャx86_64の未定義シンボル"

2022-01-22 22:35:30

質問内容

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ライブラリはFoundation Frameworkのような標準的なFrameworkなのです。

上記の文章で何が足りないのでしょうか?

また、32ビットマシン用にビルドしてみました(ビルドは再び失敗)。これは明らかにリンカーエラーですが、ヘッダーファイルが IOBluetooth という標準的に含まれる Framework のものであるにもかかわらず、x86 と x64 の両方のアーキテクチャで IOBluetoothDevice の実装を見つけることに問題があること以外は、それが何に関連しているか見当もつかないのですか?

ちなみに私のメインコード "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;
}

何かお手伝いやご指摘がありましたら、よろしくお願いします。

どのように解決するのですか?

プロジェクトにIOBluetooth.frameworkが含まれていないようです。以下の方法で追加することができます。

  • 左ペインの左上にある自分のプロジェクト(青いアイコン)をクリックする。

  • 中央のペインで、Build Phasesタブをクリックします。

  • "Link Binary With Libraries"の下にある、プラスボタンをクリックします。

  • リストからIOBluetooth.frameworkを探し、Addをクリックします。

これで、IOBluetooth.framework の定義がリンカーに検出されるようになります。左ペインでフレームワークをクリックし、右ペインでフレームワークのターゲットメンバーシップを見ることによって、フレームワークがターゲットのメンバーであることを確認できます (整理のためにフレームワークを Frameworks グループの下に移動させたことに注意してください)。