Error de comstackción de Xcode “Símbolos indefinidos para la architecture x86_64”

Una pregunta para principiantes de Xcode:

Es mi primera experiencia con Xcode 4.6.3.

Estoy intentando escribir un progtwig 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 statement 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 architecture 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  #import  // Note the import for bluetooth #import  // Note the import for bluetooth int main(int argc, const char * argv[]) { @autoreleasepool { IOBluetoothDevice *currentDevice; NSArray *devices = [ IOBluetoothDevice pairdDevices]; 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 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.

enter image description here

enter image description here

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

enter image description here

UPD

Apple requiere usar la architecture 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 architecture armv7, armv7s y arm64 por defecto.

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

Entonces, lo que necesita es cambiar las “Arquitecturas” para su objective de proyecto como este

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

enter image description here

Símbolos indefinidos para la architecture 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 comstackdor 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!!

También he visto este error en Xcode 7.2 cuando los datos derivados se corrompen (en mi caso, interrumpí una comstackció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).

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 objective. Debe ingresar y establecer los destinos de cada archivo manualmente después de las palabras:

Proyecto Xcode con ilustración de membresía de destino manual

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

Símbolos indefinidos para la architecture 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 architecture 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 objectives 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 comstackr y construir con éxito.

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

O

~ / Biblioteca / Desarrollador / Xcode / DerivedData /

enter image description here

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”)

enter image description here

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

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.

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ó.

Intenté casi todo aquí pero mi problema resultó ser los rests 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

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 

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

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

Traté de limpiar y eliminar la carpeta de comstackció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ó.

También podría ser un #include en el archivo .c que está intentando comstackr.

Sé que es una vieja pregunta, pero hoy recibí el mismo error y ninguna de las soluciones anteriores funcionó.

Lo han arreglado sin embargo al configurar la opción:

 Project -> Architecture -> Build Active Architecture Only 

a Sí

y proyecto comstack y construye apropiadamente