objective-c xcode macos cocoa iobluetooth

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



objective-c macos (15)

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 busca dispositivos BT emparejados y los imprime en un NSLog.

Se genera 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 enlazador no encuentra ninguna implementación (* .m-file). Sin embargo, la biblioteca IOBluetooth es un Framework estándar como Foundation Framework.

¿Qué me estoy perdiendo en mi declaración anterior?

También he intentado construirlo para una máquina de 32 bits (la construcción falla nuevamente). Claramente es un error de enlazador, sin embargo, no tengo ni idea, con lo que se relaciona, excepto que hay un problema al encontrar la implementación de IOBluetoothDevice, tanto en la arquitectura x64 como x64, mientras que los archivos de cabecera son 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.


Símbolos indefinidos para la arquitectura x86_64: "_OBJC_CLASS _ $ _ xxx", a los que se hace referencia desde: objc-class-ref en yyy.o

Esto generalmente significa que está llamando "xxx" (puede ser un marco o clase) de la clase "yyy". El compilador no puede ubicar el "xxx" por lo que se produce este error.

Debe agregar los archivos que faltan (en este caso, "xxx") haciendo clic con el botón derecho en la carpeta del proyecto en la ventana del navegador y tocando la opción " Agregar archivos a" YourProjectName " ".

Una ventana emergente abrirá sus archivos de proyecto en Finder. Allí, puede ver los archivos que faltan y simplemente agregarlos a su proyecto. No olvide marcar la casilla " Copiar elementos si es necesario ". ¡¡Buena suerte!!


Al actualizar a Xcode 7.1, es posible que vea este tipo de error y no se pueda resolver con ninguna de las respuestas anteriores. Uno de los síntomas en mi caso fue que la aplicación se ejecuta en el dispositivo, no en el simulador. Probablemente verá una gran cantidad de errores relacionados con prácticamente todos los marcos que está utilizando.

La solución es bastante simple. Solo tiene que eliminar una entrada de la configuración "Rutas de búsqueda del marco de trabajo", que se encuentra en la sección OBJETIVOS> Configuraciones de la construcción> Rutas de búsqueda (asegúrese de que esté seleccionada la pestaña "Todas")

Si ve otra entrada aquí (además de $ (heredado)) para su (s) objetivo (s) principal (es) o su objetivo de prueba, simplemente elimine la ruta defectuosa de todos los objetivos y recupérela.


Bajo Xcode 9.0b5 puede encontrar esto porque Xcode 9.0b5 tiene un error en el que cuando se agrega el código fuente, no respeta la configuración del objetivo. Debe ingresar y establecer los destinos de cada archivo manualmente después de las palabras:


En mi caso, construí un marco personalizado con el objetivo de implementación establecido en 9.1, pero el objetivo de implementación de mi aplicación fue menor, lo que soporta 8.1. Minimice el marco personalizado El objetivo de implementación resolvió mi problema.


En mi caso, no era una biblioteca, eran algunas clases ...

Símbolos indefinidos para la arquitectura x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", a la que se hace referencia desde: objc-class-ref en SomeClassName ".

d: símbolo (s) no encontrado (s) para la arquitectura x86_64

clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación)

Solución : Tenía varios objetivos en Xcode con varios esquemas (producción, desarrollo, etc.). Faltaba parte de la implementación recientemente agregada (Class.m).

Xcode-> Targets-> Build Phases-> Compile Sources

Entonces tuve que agregarlos manualmente.

entonces podría compilar y construir con éxito.


He encontrado que esto también puede ocurrir si arrastras una carpeta con archivos Objective-C a tu proyecto. Si esa carpeta aparece en azul, creo que indica que no está bien vinculada. Puede verificar esto (si usa el control de versiones) porque siempre que agregue archivos nuevos, el archivo pbxproj debería actualizarse con enlaces a esos archivos nuevos. Sin embargo, puede encontrar que después de agregar una carpeta, el archivo pbxproj no cambió (y, por lo tanto, hay un error de enlace). Por lo tanto, obtendrá el trabajo de autocompletado y encontrará las clases que importó, pero cuando se trata de construir realmente la imagen falla con este código de error.

La solución es no agregar la carpeta, sino agregar los archivos. Haga esto y debería ver la actualización del archivo pbxproj y debería corregir este error.

Esto también supone que ha hecho lo que se sugirió anteriormente y ha vinculado correctamente todos los marcos adecuados.


Intenté casi todo aquí pero mi problema resultó ser los restos de una construcción anterior de cocoapods. Lo que funcionó para mí fue:

  1. rm -Rf Pods; pod install
  2. Eliminar datos derivados (Ventana / Proyectos ... seleccione su destino, haga clic en Eliminar botón)
  3. Reconstruir

Para mí, esto comenzó a suceder después del conflicto de fusión.

Traté de limpiar y eliminar la carpeta de compilación, pero nada de eso me ayudó. Este problema siguió ocurriendo independientemente. Luego volví a vincular la referencia eliminando los grupos que eran problemáticos y volví a agregar al proyecto y funcionó.


Parece que te falta incluir el marco IOBluetooth en tu proyecto. Puedes agregarlo por:

-Haciendo clic en su proyecto en la esquina superior izquierda del panel izquierdo (el ícono azul).

-En el panel central, haga clic en la pestaña Crear fases.

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

-Busca el marco IOBluetooth de la lista y presiona Agregar.

Esto asegurará que el enlazador encuentre las definiciones de marcos de IOBluetooth. Puede ver que el marco es un miembro de su objetivo haciendo clic en el marco en el panel izquierdo y viendo la membresía objetivo del marco en el panel derecho (nota que he movido el marco bajo el grupo de Frameworks para fines de organización):


Si obtiene este error al intentar vincular un archivo C, primero revise los nombres de las funciones para detectar errores tipográficos. A continuación, compruebe dos veces que no está tratando de llamar a una función C desde un entorno C ++ / Objective-C ++ sin utilizar la construcción extern C {} . Me estaba arrancando los pelos porque tenía una clase que estaba en un archivo .mm que intentaba llamar a las funciones C. No funciona porque en C ++, los símbolos están destrozados. En realidad, puede ver los símbolos concretos generados con la herramienta nm. Terminal a la ruta de los archivos .o, y ejecute nm -g en el archivo que está llamando al símbolo y el que debería tener el símbolo, y debería ver si coinciden o no, lo que puede proporcionar pistas sobre el error .

nm -g file.o

Puede inspeccionar los símbolos de C ++ exigidos con esto:

nm -gC file.o


También encontré el mismo problema, los métodos anteriores no funcionarán. Accidentalmente borré los archivos en el siguiente directorio en él.

O

~ / Biblioteca / Desarrollador / Xcode / DerivedData /


También he visto este error en Xcode 7.2 cuando los datos derivados se corrompen (en mi caso, interrumpí una compilación y sospeché que esa era la causa raíz).

Entonces, si las otras soluciones (especialmente las de Chris y BraveS que sospecho son más probables) no se ajustan a su problema, intente eliminar los datos derivados (Seleccione: Ventana / Proyectos / Datos derivados -> Eliminar) y vuelva a generar.

(Agregado para referencia por otros - Sé que la pregunta original ha sido respondida correctamente).


También podría ser un #include <windows.h> en el archivo .c que está intentando compilar.


Tuve el mismo error, porque en vez de eliminar un archivo simplemente eliminé las referencias al mismo. Ubicar el archivo en Finder y eliminarlo ayudó.


UPD

Apple requiere usar la arquitectura arm64 . No use bibliotecas x32 en su proyecto

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

Respuesta anterior

El nuevo Xcode 5.1 establece la arquitectura armv7, armv7s y arm64 por defecto.

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

Entonces, lo que necesita es cambiar las "Arquitecturas" para su objetivo de proyecto como este

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