Error de compilación de Xcode "Símbolos indefinidos para la arquitectura x86_64"

Resuelto RisingSun asked hace 11 años • 29 respuestas

Una pregunta para principiantes de Xcode:

Es mi primera experiencia con Xcode 4.6.3.

Estoy intentando escribir un programa de consola muy simple que busque dispositivos BT emparejados y los imprima en un NSLog.

Se construye con el siguiente 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)

Busqué como loco. El problema común debería ser una referencia a un archivo, del cual solo se importan los archivos de encabezado y el vinculador no encuentra ninguna implementación (archivo *.m). Sin embargo, la biblioteca IOBluetooth es un marco estándar como Foundation Framework.

¿Qué me falta en mi declaración anterior?

También intenté compilarlo para una máquina de 32 bits (la compilación falla nuevamente). Es claramente un error del vinculador, sin embargo, no tengo idea de lo que se relaciona, excepto que hay un problema al encontrar la implementación para IOBluetoothDevice, tanto en la arquitectura x86 como en la x64, mientras que los archivos de encabezado provienen de un marco estándar incluido, llamado ¿IOBluetooth?

Para su información mi código principal "main.m" es:

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

Gracias por cualquier ayuda o sugerencias en la dirección correcta.

RisingSun avatar Aug 24 '13 00:08 RisingSun
Aceptado

Parece que le falta incluir IOBluetooth.framework en su proyecto. Puedes agregarlo mediante:

  • Al hacer clic en su proyecto en la parte superior izquierda del panel izquierdo (el icono azul).

  • En el panel central, haga clic en la pestaña Fases de compilación.

  • En "Vincular binario con bibliotecas", haga clic en el botón más.

  • Busque IOBluetooth.framework en la lista y presione Agregar.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Esto garantizará que el vinculador encuentre las definiciones de IOBluetooth.framework. Puede ver que el marco es miembro de su objetivo al hacer clic en el marco en el panel izquierdo y ver la membresía objetivo del marco en el panel derecho (tenga en cuenta que moví el marco al grupo Marcos para fines de organización):

ingrese la descripción de la imagen aquí

Chris Livdahl avatar Aug 24 '2013 00:08 Chris Livdahl

UPD

Apple requiere utilizar la arquitectura arm64 . No utilice bibliotecas x32 en su proyecto

¡Entonces la respuesta a continuación ya no es correcta!


Antigua respuesta

El nuevo Xcode 5.1 establece la arquitectura armv7,armv7s y arm64 como predeterminada.

Y a veces el error "fallo de compilación "Símbolos no definidos para la arquitectura x86_64"" puede deberse a esto. Porque algunas bibliotecas (no las de Apple) se compilaron originalmente para x32 y no son compatibles con x64.

Entonces, lo que necesita es cambiar las "Arquitecturas" para el objetivo de su proyecto de esta manera

NÓTESE BIEN. Si está utilizando Cocoapods, debe hacer lo mismo con el objetivo "Pods".

ingrese la descripción de la imagen aquí

Aleksey Potapov avatar Mar 28 '2014 08:03 Aleksey Potapov