Error de compilación de Xcode "Símbolos indefinidos para la arquitectura x86_64"
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.
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.
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):
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".