símbolo (s) no encontrado para la arquitectura i386

113

Al intentar compilar con Xcode, aparece el siguiente error:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

No estoy seguro de lo que significa.

Doz
fuente

Respuestas:

92

Si este tipo de cosas aparecen repentinamente, generalmente significa que al proyecto le faltan algunos marcos que necesita. Las bibliotecas y los proyectos dependientes pueden requerir marcos, por lo que si agregó uno recientemente, eso puede causar este error.

Para agregar marcos, haga clic con el botón derecho en el nombre del proyecto en la vista del proyecto, seleccione Addy luego seleccione Existing frameworks...de la lista. Luego busca el marco con los símbolos que te faltan.

En cuanto a cómo encontrar los marcos que necesita, he encontrado que usar Google es el más fácil, aunque probablemente también podría usar la búsqueda de ayuda de Xcode. Busque uno de los símbolos, haciendo todo lo posible para encontrar el nombre no mutilado (p. Ej., SCNetworkReachabilityGetFlags), Y luego el primer enlace de documentación que encuentre en developer.apple.com suele ser el correcto. Normalmente no tienes que cazar muy lejos. En este caso, esa es esta página:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Luego, en la parte superior de la página, le indica qué marco utilizar, SystemConfigurationen este caso. Así que agregue eso al proyecto y compile nuevamente.

Entonces sigue haciendo esto hasta que funcione ...

Editar: nunca he usado el simulador, pero esto es lo que haces en el dispositivo, supongo que es lo mismo ...

Cœur
fuente
64

A veces hay archivos de origen que faltan en su objetivo.

  1. examinar qué símbolos faltan
  2. destino-> fases de compilación-> fuente de compilación
  3. agregue los archivos fuente que faltan si no están en la lista
  4. comando + b para felicidad

Puede seleccionar los archivos que parecen estar "perdidos" y comprobar en la barra de utilidades de la derecha que sus casillas de verificación están seleccionadas para el objetivo que está creando.

Nir Pengas
fuente
1
Esto puede ocurrir a menudo cuando se combinan dos archivos de proyecto de forma no limpia y se pierde la membresía de destino.
Steven Hepting
1
¡Muchas gracias, de alguna manera xcode no agregó el archivo .m requerido en la etapa de fases de compilación!
Dreampowder
1
Gracias :) Agregue 2 archivos al proyecto y solo después de hacer esos pasos todo estuvo bien
user1105951
32

Lo resolví usando el siguiente método (para XCode 4):

1) Seleccione el proyecto en la ventana de navegación del proyecto que mostrará el resumen del proyecto a la derecha

2) Seleccione las fases de construcción de la cuarta pestaña

3) Seleccione la opción Vincular binario con biblioteca

4) Agregue el marco para el que está obteniendo

5) Mueva el marco de la carpeta principal a la carpeta de marcos

6) Vuelva a construirlo y los errores desaparecerán.

Pruthvid
fuente
Gracias. Encontré esta respuesta en la búsqueda de MFMailCompose y la resolví agregando MessageUI.framework
Frank Yin
17

El problema es que la membresía de destino para el archivo agregado falta en el destino de la aplicación. Por lo tanto, seleccione el archivo y agregue la marca de verificación a la casilla de membresía de destino

Por ejemplo, si el error que se muestra en la definición de un método en común.ingrese la descripción de la imagen aquí

Lithu TV
fuente
Recibí este error de Símbolo no encontrado, pero la situación era mucho más simple. Agregué un nuevo módulo (archivo) con una nueva función que necesitaba para uno de mis esquemas. Cuando construí un esquema diferente unas semanas más tarde, no se encontró la llamada a esa función. Agregarlo al objetivo era todo lo que se necesitaba.
Será el
17

Pensé en agregar mi solución para esto, después de pasar unas horas con el mismo error :(

Los chicos de arriba tenían razón en que lo primero que debe verificar es si se olvidó de agregar algún marco, vea los pasos proporcionados por Pruthvid arriba.

Resultó que mi problema era que faltaba una clase de compilación después de que la eliminé y luego la volví a agregar.

Verifique sus "Fuentes de compilación" como se muestra para las clases de error reportadas. Agregue las clases faltantes que creó.

justinkoh
fuente
2
GRACIAS ... Esto funciona para mí. Estaba implementando una clase personalizada. Copió tanto la clase personalizada. hy .m en el proyecto. Hice una #importación, aún aparece el error. ¡Añadiendo la clase personalizada '.m en la sección "Compilar fuentes" se solucionó!
GeneCode
¡Increíble! Tuve el mismo problema que Rocotilos, importé una clase personalizada, importé, pero aún tuve el problema. ¡Esto hizo el truco! ¡Muchas gracias!
Souleiman
8

Asegúrese de que el marco que falta se enumera realmente en "Destino / Fases de construcción / Vincular binarios con bibliotecas" si no lo agrega. Como se mencionó anteriormente, generalmente indica un marco faltante.

En mi proyecto había dos marcos idénticos en la lista, cuando eliminé uno de ellos tuve este error, porque también lo eliminó de la lista "Vincular binarios con bibliotecas". Agregué de nuevo y el problema desapareció (y todavía tengo dos marcos enumerados)

Tibidabo
fuente
6

Arreglé un error similar en mi proyecto cambiando la Configuración de compilación> Arquitecturas para TODOS mis objetivos.

El problema: cuando actualicé de Xcode 4.4 a Xcode 4.5, mi proyecto aún se compilaba bien en el simulador pero no en los dispositivos. En los dispositivos, arrojaba el error "símbolo (s) no encontrado para la arquitectura armv7s", junto con el engañoso "Error del vinculador de Apple Mach-O" y "clang: error: el comando del vinculador falló con el código de salida 1 (use -v para ver la invocación ). "

La causa (en mi caso): Mi proyecto tenía varios objetivos, y aunque la Configuración de compilación> Arquitecturas para el objetivo principal se estableció para incluir la arquitectura armv7s, el objetivo principal dependía de otro objetivo (listado en Fases de compilación> Dependencias), y No había pensado en restablecer la Configuración de compilación> Arquitecturas para ese otro objetivo, y tuve que cambiar eso para incluir armv7s. Supongo que el simulador y el dispositivo se ejecutan en arquitecturas diferentes, y es por eso que el simulador estuvo bien mientras que el dispositivo no.

Josh
fuente
5

¿Su proyecto depende de otro proyecto y es un objetivo en ese proyecto configurado para ser una dependencia directa de su objetivo principal? Si este es el caso y la dependencia no está configurada, es posible que el destino dependiente no se esté construyendo para todas las configuraciones (es decir, el simulador)

Solo una suposición descabellada.

James J
fuente
4

Otra situación que puede causar este problema es si su código llama a C ++, o es llamado por código C ++. Tuve un problema con la función de utilidad de mi propio archivo .c que se mostraba como "símbolo no encontrado" cuando se llamaba desde Obj-C. La solución fue cambiar el tipo de archivo: en Xcode 4, use el panel de información extendido para establecer el tipo de archivo en "Objective-C ++ Source"; en Xcode 3, use "Obtener información" para cambiar el tipo de archivo a "source.cpp.objcpp".

nombre inválido
fuente
4

En mi caso, ninguna de las soluciones publicadas funcionó. Tuve que eliminar el proyecto y realizar una nueva compra desde el servidor SVN . Por suerte, el proyecto estaba alojado en un sistema de control de versiones. No sé qué haría de otra manera.

otaviokz
fuente
2

En un proyecto de C ++ que usa una clase con plantilla definida , mientras recibía el mismo error, seleccioné el archivo .cpp con la clase con plantilla definida en el Navegador de proyectos, luego Eliminar> Eliminar referencia. Además, el archivo .h asociado, aunque todavía se hace referencia en el proyecto, debe tener una declaración #include al .cpp de la siguiente manera:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Si quieres ver, hay un ejemplo de proyecto simple en github :

Esto es un pequeño truco indirecto y no recuerdo la fuente original de esta solución.

vmanjz
fuente
2

Si este error aparece de repente, significa que al proyecto le faltan algunos marcos. Las bibliotecas y los proyectos dependientes pueden requerir marcos, por lo que si agregó uno recientemente, eso puede causar este error.

Para agregar marcos, haga clic con el botón derecho en el nombre del proyecto en la vista del proyecto, seleccione Agregar y luego seleccione Marcos existentes de la lista. Luego busca el marco con los símbolos que te faltan.

La otra cosa es que si agregó alguna clase en los recursos compilados y eliminó esas clases del proyecto, aparece el error. Lo mejor que puede hacer es eliminar las clases de los recursos de compilación (Configuración de compilación -> fuentes de compilación) que se eliminaron del proyecto.

En mi caso, agregué las clases admob en el proyecto y compilé el proyecto. En un caso posterior, no quiero incluir admobs en mi proyecto, así que eliminé las referencias de las clases de admob de mi proyecto. Cuando se produjo este error, eliminé la clase .m de mi admob de los recursos de compilación y resolví este problema.

Abhilash Reddy kallepu
fuente
2

Esto me sucedió al intentar copiar la biblioteca de demostración de PSPDFKIT en mi proyecto. Seguí todas las instrucciones en el sitio + todas las sugerencias en esta página ... por alguna razón seguía dando el error anterior, el problema era que si capturaba el mensaje en el método de error ... solo aparecía en el binario ( obviamente no tengo acceso al código fuente porque tengo que pagar por él).

Sin embargo, noté esto en la página de instrucciones:

ingrese la descripción de la imagen aquí

Así que fui a las entrañas de ese archivo de configuración y encontré esto:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Luego fui al proyecto de muestra proporcionado por el autor de dicha biblioteca ... y noté que los indicadores anteriores se copiaron literalmente a los otros indicadores del vinculador en mi configuración de compilación ... sin embargo, en mi proyecto ... ¡no lo estaban! Simplemente los copié y pegué en la configuración de compilación de mi proyecto, otras banderas del enlazador y ¡todo funcionó!

punto importante: si confía en algún archivo .xcconfig en su configuración, verifique dos veces con una fuente de código de muestra o algo y asegúrese de que realmente se haya aplicado ... no se aplicó correctamente en mi caso

abbood
fuente
0

Otra razón por la que esto podría estar sucediendo es cuando ACTUALIZA un SDK.

Si simplemente elimina el grupo y luego arrastra y suelta la nueva carpeta para proyectar, la "Ruta de búsqueda de biblioteca" tendría ambos SDK. Para resolverlo, simplemente elimine la ruta del SDK anterior.

samwize
fuente
0

Había usado un CLGeocoder sin agregar un Core.Location Framework. Básicamente, este error puede significar varias cosas. Espero que esto ayude a alguien más.

logixólogo
fuente
0

Este me ha dejado perplejo antes solo para darme cuenta de que agregué una @interface de solo datos y olvidé agregar el bloque de @implementation vacío.

Steve Tranby
fuente
0

Encontré este problema en Xcode 11, la solución fue cambiar el objetivo de implementación mínimo de 10.0 a 11.0, espero que esto ayude a alguien :)

VeganKid
fuente