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.
fuente
$(inherited)
a otras banderas vinculadoras , limpie y construya.Respuestas:
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.
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):
fuente
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".
fuente
Valid Architectures
yArchitectures
.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!!
fuente
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).
fuente
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.
fuente
En mi caso, no era una biblioteca, eran algunas clases ...
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
Así que tuve que agregarlos manualmente.
entonces podría compilar y construir con éxito.
fuente
También encontré el mismo problema, los métodos anteriores no funcionarán. Accidentalmente borré los archivos en el siguiente directorio.
O
~ / Library / Developer / Xcode / DerivedData /
fuente
~/Library/Developer/Xcode/DerivedData/
través de la CLI que puede limpiar el directorio de la siguiente manera:rm -rf ~/Library/Developer/Xcode/DerivedData/
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)
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.
fuente
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.
fuente
Intenté casi todo aquí, pero mi problema resultó ser los restos de una construcción anterior de cocoapods. Lo que funcionó para mí fue:
rm -Rf Pods; pod install
fuente
Tuve el mismo error, porque en lugar de eliminar un archivo simplemente eliminé referencias a él. Localizar el archivo en Finder y eliminarlo ayudó.
fuente
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:
a sí
y el proyecto compila y construye correctamente
fuente
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.
fuente
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 ejecutarnm -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 para el error.Puede inspeccionar los símbolos de C ++ exigidos con esto:
fuente
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.
fuente
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.
fuente
Lo resolví agregando "-lc ++" en Otros indicadores de vinculador en Configuración de compilación.
fuente
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ó.
fuente
También podría estar
#include <windows.h>
en el archivo .c que está intentando compilar.fuente
en mi caso tuve que agregar
a mi podfile y luego eliminar el directorio / Pods y ejecutar `pod install`(Xcode 10.1)
fuente
Esto podría ayudar a alguien. Me tomó días finalmente resolverlo. Estoy trabajando en OBJ-C y fui a:
Project
->Build Phases
->Compile sources
y agregué el nuevoVC.m
archivo 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
.m
archivos 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.
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.
fuente
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.
fuente
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.
fuente
En mi caso el problema fue la arquitectura del framework compilado.
Estoy ejecutando Xcode 11 y estoy usando Swift 5.1
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.
fuente