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

168

La pregunta de un principiante de Xcode:

Es mi primera experiencia con Xcode 4.6.3.

Estoy tratando de escribir un programa de consola muy simple, que busca dispositivos BT emparejados y los imprime 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 (* .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 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 existe un problema para encontrar la implementación de IOBluetoothDevice, tanto en la arquitectura x86 como en la x64, mientras que los archivos de encabezado provienen de un Framework incluido estándar, 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 punteros a la dirección correcta.

Sol naciente
fuente
17
Intente agregar $(inherited)a otras banderas vinculadoras , limpie y construya.
Resty
1
Cuando me encontré con esto, descubrí que tenía que ir al Inspector de archivos para el archivo my marcar la casilla debajo de Membresía de destino para exportarlo (?) Al módulo donde estaba tratando de usarlo.
Landon Kuhn

Respuestas:

123

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

-Haga clic en su proyecto en la esquina superior izquierda del panel izquierdo (el icono azul).

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

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

-Encuentre el IOBluetooth.framework de la lista y presione Agregar.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Esto asegurará que el enlazador encuentre las definiciones IOBluetooth.framework. 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 (tenga en cuenta que he movido el marco bajo el grupo Marcos para fines de organización):

ingrese la descripción de la imagen aquí

Chris Livdahl
fuente
3
¡Funcionó! ¡Muchas gracias también por el esfuerzo de tomar algunas capturas de pantalla!
RisingSun
Lo mismo funciona bien para el marco oAuthIOS. Agregue el marco oAuthIOS de la carpeta de pods al proyecto raíz que está intentando construir
prodeveloper
1
Estoy buscando IOBluetooth.framework, pero no está allí: S
Menno van der Krift
Eso es extraño, debería estar allí.
Chris Livdahl
¡Increíble! Me salvó algunas horas!
Bravo Kevin
49

UPD

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

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


Vieja respuesta

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 arquitectura x86_64 "" puede ser causado por esto. Porque, algunas librerías (no las de Apple) se compilaron para x32 originalmente 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 usa Cocoapods, debe hacer lo mismo para el objetivo "Pods".

ingrese la descripción de la imagen aquí

Aleksey Potapov
fuente
3
Básicamente eliminé la cosita arm64 de la propiedad Valid Architectures. Entonces, como se muestra en lo anterior, ¡se verá obligado a mirar solo lo que hay en las arquitecturas válidas, supongo!
Randika Vishman
@Vishman, hola! Hay una buena respuesta SO que cubre la diferencia entre Valid Architecturesy Architectures.
Aleksey Potapov
Se corrigieron mis errores vinculados en Xcode 5 cuando intentaba ejecutar el proyecto en el simulador de iOS 7.1, en el simulador de iOS 6.x funcionó bien por defecto, gracias :)
Zsivics Sanel
@BraveS: Al eliminar la arquitectura arm64, ¿funcionará para dispositivos de 64 bits?
Jayprakash Dubey
1
@JayprakashDubey Hola, cargué una tienda de aplicaciones integrada sin soporte de 64 bits, rechazaron mi aplicación. Cuando intento agregar el arm64, me encuentro con un error de compilación de error "Símbolos indefinidos para la arquitectura x86_64". si elimino arm64 de la arquitectura. y puse arm64 en una arquitectura válida. ¿Mi aplicación está aprobada?
SP Balu Kommuri
31

Símbolos indefinidos para arquitectura x86_64: "_OBJC_CLASS _ $ _ xxx", referenciado desde: objc-class-ref en aaa.o

Esto generalmente significa que está llamando "xxx" (puede ser un marco o una clase) desde la clase "aaa". El compilador no puede localizar 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!!

Confuso
fuente
17

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

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

(Agregado para referencia de otros, sé que la pregunta original ha sido respondida correctamente).

Ali Beadle
fuente
14

En Xcode 9.0b5 puede encontrar esto porque Xcode 9.0b5 tiene un error en el que cuando agrega el código fuente, no respeta la configuración de destino. Debe ingresar y establecer el destino de cada archivo manualmente.

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

William Cerniuk
fuente
13

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

Símbolos indefinidos para la arquitectura x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", referenciada desde: objc-class-ref en SomeClassName ".

d: símbolo (s) no encontrado (s) para 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 mi implementación recién agregada (Class.m) en

Xcode-> Targets-> Build Fases-> Compile Sources

Así que tuve que agregarlos manualmente.

entonces podría compilar y construir con éxito.

Udaya Sri
fuente
Esto resolvió mi problema. Estaba usando el marco dinámico. Otra cosa es que no me gusta la idea de agregar manualmente.
toxicsun
9

También encontré el mismo problema, los métodos anteriores no funcionarán. Accidentalmente borré los archivos en el siguiente directorio. ingrese la descripción de la imagen aquí

O

~ / Library / Developer / Xcode / DerivedData /

ingrese la descripción de la imagen aquí

ylgwhyh
fuente
44
Para aquellos que se preguntan cuál es la ruta / comando real: es a ~/Library/Developer/Xcode/DerivedData/ través de la CLI que puede limpiar el directorio de la siguiente manera:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus
6

Al actualizar a Xcode 7.1, puede ver este tipo de error y ninguna de las respuestas anteriores puede resolverlo. 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 casi todos los marcos que está utilizando.

La solución es en realidad bastante simple. Solo necesita eliminar una entrada de la configuración "Rutas de búsqueda de marco", que se encuentra en la sección OBJETIVOS> Configuración de compilación> Rutas de búsqueda (asegúrese de que la pestaña "Todos" esté seleccionada)

ingrese la descripción de la imagen aquí

Si ve otra entrada aquí (además de $ (heredado)) para sus objetivos principales o su objetivo de prueba, simplemente elimine la ruta defectuosa de todos los objetivos y reconstruya.

whyoz
fuente
5

He descubierto que esto también puede ocurrir si arrastra una carpeta con archivos Objective-C a su proyecto. Si esa carpeta aparece azul, creo que indica que no está vinculada correctamente. Puede verificar esto (si usa el control de versiones) porque cada vez que agrega nuevos archivos, el archivo pbxproj debe actualizarse con enlaces a esos nuevos archivos. 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 autocompletado y encontrará las clases que importó, pero cuando se trata de construir 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 solucionar este error.

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

Agresor
fuente
5

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 el botón Eliminar)
  3. Reconstruir
silbido solitario
fuente
4

Tuve el mismo error, porque en lugar de eliminar un archivo simplemente eliminé referencias a él. Localizar el archivo en Finder y eliminarlo ayudó.

Alatoo
fuente
3

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

Sin embargo, lo arreglé configurando la opción:

Project -> Architecture -> Build Active Architecture Only

a sí

y el proyecto compila y construye correctamente

Rafael
fuente
3

Me he enfrentado a este problema muchas veces. Esto generalmente ocurre cuando elimina su carpeta de compilación.

La solución fácil es desintegrar e instalar los archivos pod nuevamente.

pod deintegrate
pod install
Anirudha Mahale
fuente
2

Si recibe este error cuando intenta vincular a un archivo C, primero verifique los nombres de las funciones para ver si hay errores tipográficos. A continuación, verifique que no esté intentando llamar a una función C desde un entorno C ++ / Objective-C ++ sin utilizar la extern C {}construcción. Me estaba arrancando el pelo 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 ejecutar nm -gen 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 para el error.

nm -g file.o

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

nm -gC file.o
james_alvarez
fuente
2

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 era menor, que admite 8.1. Minimizar el marco personalizado El objetivo de implementación resolvió mi problema.

jeffreysuej
fuente
2

Llego tarde a la fiesta, pero pensé en compartir un escenario más donde esto podría suceder. Estaba trabajando en un marco y lo distribuía a través de cocoapods. El marco tenía clases y protocolos objetivos c y rápidos y se estaba construyendo con éxito. Mientras usaba pod en otro marco o proyecto, estaba dando este error ya que olvidé incluir archivos .m en podspec. Incluya los archivos .swtift, .h y .m en sus fuentes de podspec de la siguiente manera: s.source_files = "Projectname / Projectname / ** / *. {Swift, h, m}"

Espero que ahorre el tiempo de otra persona.

Pranav Gupta
fuente
2

Lo resolví agregando "-lc ++" en Otros indicadores de vinculador en Configuración de compilación.

Krishna Mudhiraj
fuente
1

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

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

green0range
fuente
1

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

Lorenzo Andraghetti
fuente
1

en mi caso tuve que agregar

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
a mi podfile y luego eliminar el directorio / Pods y ejecutar `pod install`

(Xcode 10.1)

Brooks DuBois
fuente
1

Esto podría ayudar a alguien. Me tomó días finalmente resolverlo. Estoy trabajando en OBJ-C y fui a:

Project-> Build Phases-> Compile sourcesy agregué el nuevo VC.marchivo que acababa de agregar.

Estoy trabajando con código heredado y, por lo general, soy un novato, nuevo en OBJ-C, por lo que ni siquiera pensé en importar mis .marchivos a una biblioteca de fuentes.

EDITAR:

Me encontré con este problema por segunda vez y era otra cosa. Esta respuesta me salvó después de 5 horas de depuración. Intenté todas las opciones en este hilo y más. https://stackoverflow.com/a/13625967/7842175 Por favor, dale crédito si esto te ayuda, pero básicamente es posible que necesites establecer tu archivo en su objetivo en el inspector de archivos.

Este es su inspector de archivos, solo asegúrese de que todos los objetivos que necesita estén "marcados"

Con todo, este es un código de error muy vago que podría ser causado por muchas razones, así que siga probando diferentes opciones.

valeriana
fuente
1

En algún momento, olvido copiar la biblioteca de Release-universal y copiar por error desde Release-iphoneos. Por lo general, Release-iphoneos contiene un archivo que se ha podado para X86. y entonces da el error.

Saleh Enam Shohag
fuente
1

en mi caso, eliminar la selección de membresía objetivo y luego seleccionar nuevamente solucionar el problema.

Verifique la respuesta de William Cerniuk con la foto adjunta.

usuario1105951
fuente
0

En mi caso el problema fue la arquitectura del framework compilado.
Estoy ejecutando Xcode 11 y estoy usando Swift 5.1

  • Tenía 3 objetivos como:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Intenté ejecutar pruebas, pero el producto MyAppFrameWork se compiló para dispositivos iOS genéricos y el objetivo de prueba necesitaba un brazo x86-64, así que reconstruí Framework para simuladores iOS y los casos de prueba comenzaron a ejecutarse con éxito.

Mohammad Reza Koohkan
fuente