Símbolos indefinidos para la arquitectura i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", referenciado desde: error


236

He importado framework para enviar correos electrónicos desde la aplicación en segundo plano, es decir, SKPSMTPMessageFramework. ¿Alguien puede sugerir por qué se muestra el siguiente error?

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Fuente de la que se toma el marco: -

Bloqueo de los campos en MFMailComposeViewController

Actualización :

Respuesta: Simplemente arrastre y suelte la carpeta sobre el proyecto y haga clic en copiar. Eso es seleccionar la casilla de verificación del proyecto y la casilla de verificación de destino también.


Después de agregar SystemConfiguration.framework desde las fases de compilación, mi proyecto se compila bien
swiftBoy

Resolví este problema. Agregué el marco requerido para vincular binario con bibliotecas.
Mihir Oza

Respuestas:


569

Puede obtener este tipo de error si el archivo .m de su clase no figura en el paso "Compilar orígenes" de la pestaña "Fases de compilación" de su destino. Normalmente, Xcode hace esto por usted, pero a veces pierde la trama y necesita agregar el archivo .m manualmente.

Para hacer esto:

TargetSettings -> Build Fases -> Compile Sources -> add your .m class -> Build and Run


49
A veces, esos errores aparecen porque algunos marcos no están vinculados correctamente. Simplemente verifique todos los marcos en "Enlace binario con bibliotecas" en la pestaña de fase de compilación del proyecto.
Heitara

Esto también puede suceder con archivos .c, y presumiblemente .mm también.
Brodney

Rajneesh, ¿solucionaste el problema? Si es así, ¿cómo lo arreglaste?
codematrix

99
Vale la pena señalar que puede seleccionar el archivo .m y marcar la casilla junto a su objetivo en la sección "Membresía de destino" del panel derecho. Cuando agrega un archivo a su proyecto, se le pregunta si desea "Agregar a objetivos:", puede haber dicho que no, pero puede agregarlo en cualquier momento haciendo lo que le dije.
Nicolas S

44
Solía ​​tener el mismo error, la solución para la mía es: Configuración de compilación -> Vinculación -> Otras banderas de vinculador -> Agregar -lLibraryName_$(PLATFORM_NAME)dpara depuración y agregar -lLibraryName_$(PLATFORM_NAME)para lanzamiento
George

37

Para mí, el problema resultó ser la falta de marcos. Una vez que los agregué, funcionó.


Esto parecía una posibilidad remota, ya que en realidad no coincidía con los mensajes de error que recibía, pero agregar los marcos dependientes sugeridos en el sitio SocketRocket también me lo arregló.
Pat

Incluso si agrega marcos a través de cocoapods, esto puede suceder. Tuve que agregarlo manualmente como marco también. ¡Gracias!
FBente

El Framework que agregué necesitaba que se agregaran otros Frameworks antes de que se compilara. Si está agregando un Marco, verifique para asegurarse de haber agregado cualquier Marco que pueda necesitar
Dave Patrick

29

Verifique las propiedades exclusivas de Arquitecturas válidas y Construir arquitectura activa.

ingrese la descripción de la imagen aquí


1
¿puede decirme cómo abrir esta ventana de opciones en Xcode 4.2
Anand

Si esto no ayuda, vea la respuesta de Allen Pike a continuación.
MattyG

Tanto esta respuesta como la de Allen me ayudaron. Realmente tuve que verificar ambas cosas: compilar fuentes y construir solo arquitectura activa. ¡Muchas gracias chicos!
Bogdan

@Anand Están en Configuración de compilación para el objetivo.
Lifelogger

18

si está utilizando cocoapods, asegúrese de que la configuración de compilación de su objetivo contenga $ (heredado) en la otra sección de indicadores del vinculador

ingrese la descripción de la imagen aquí


10

¿Está compilado su marco para armv (x)? Me parece que está compilado para i386, cuyo código no se ejecutará en un dispositivo iOS. O bien, está compilado para armv (x) y está intentando ejecutarlo en el simulador, que es el código i386. Asegúrese de utilizar la configuración de compilación Akshay que se muestra arriba, que su marco está compilado correctamente para el chip en el que lo va a ejecutar.


Está ordenado. Tuve que arrastrar y soltar framework forlder en mi proyecto forlder en xCode. Gracias
Mann

¿Es posible de alguna manera compilar un marco para que se ejecute tanto en el dispositivo iOS como en el simulador simultáneamente? ¿o debería elegir siempre una sola opción?
Aleksey Tsyss

¿Estás hablando de abrir dos ventanas para el mismo proyecto y configurar una para que se ejecute en el simulador y otra en el dispositivo?
Owen Hartnett

7

Si importa algún otro proyecto en xcode y si el proyecto actual y el de importación tienen los mismos archivos en la fuente del compilador, simplemente elimine el mismo archivo en el proyecto actual en la configuración de "Fase de compilación". Funcionó para mí.


4

Sí, esto está relacionado con lo que dijo Allen ... busque TargetMembership en la sección Utilidades del archivo fuente. hay una casilla de verificación que asocia ese archivo a un proyecto. Verificar esto también resolvió este problema para mí.


Modifiqué todas las otras configuraciones, pero esta fue la que finalmente me arregló. ¡Gracias!
Alec Thomas

4

También podría ser que te falte vincular con una Biblioteca Binaria, verifica las Fases de Construcción en tus Targes, agrega las bibliotecas requeridas y luego Producto> Producto Limpio> Crear

¡Eso también debe funcionar!


4

Tuve este problema cuando abrí el mismo proyecto dos veces, solo un proyecto era el original y el otro se clonó desde una URL de git.

'Producto'> 'Limpiar' resolvió el problema.


4

También me encontré con este problema y lo solucioné comprobando si tanto la fuente de compilación como el enlace binario con la biblioteca contenían todo el archivo / biblioteca / marco que necesitaba.

ingrese la descripción de la imagen aquí


4

Cuando encontré el mismo problema que este:

Símbolos indefinidos para la arquitectura i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, referenciado desde: objc-class-ref en ConfirmController.o

Resultó que me olvidé de agregar marco. Era QuartzCore.framework para ser exactos.


@JayprakashDubey Pregúntale a Mitch por favor
D_D

4

prueba este último:

así que probé todas las sugerencias en esta página ... ninguna funcionó ... La forma en que comenzó mi problema fue siguiendo los pasos en este tutorial que enseña cómo vincular bibliotecas estáticas. Con mi proyecto de muestra, las instrucciones funcionaron bien ... pero luego, en mi proyecto real, comencé a recibir el error anterior.

Entonces, lo que hice fue seguir cada paso de dicho tutorial y construir después de cada paso ... la línea ofensiva resultó ser esta: agregando -all_load a la configuración de construcción-> otras banderas de enlace

Resulta que este indicador se recomendó una vez para vincular categorías a bibliotecas estáticas ... pero luego resultó que este indicador ya no era necesario Xcode 4.2+ ... (lo mismo ocurre con el indicador -force_load ... que también era recomendado en otras publicaciones ) ..


3

Cuando encontré el mismo problema, olvidé agregar "versión compilada de la biblioteca (con extensión .a)". Normalmente agregamos la biblioteca del proyecto importado en Target Dependency en Build Phases pero olvidamos agregar "biblioteca compilada" en Link Binary with Libraries en Build Phases.


3

Agregar lo que funcionó para mí en caso de que otros tengan el mismo problema y terminen aquí. Tenía un proyecto más antiguo que tenía la configuración CLANG_ENABLE_MODULES establecida en No. Después de horas de frustración, me comparé con un proyecto en funcionamiento y descubrí que tenía la opción Activar módulos configurados en no en mi configuración de compilación LLVM. Establecer esto en Sí resolvió mi problema y la aplicación funciona bien.

Configuración del proyecto -> Configuración de compilación -> busque 'Módulos' y Actualice los módulos de habilitación (C y Objective-C) a SÍ.


Maravillosa solución! ¡Esto me ayudó mucho! Tenía un proyecto de pods antiguo y cada vez que agregaba un pod nuevo, este error ocurría. ¡¡¡Gracias!!!
DiscDev

2

No agregué el "-all_load -lstdc ++" a Otros indicadores de vinculador en la configuración de compilación y pude iniciar el sim sin error, pero no obtuve la salida del registro MonkeyTalk cuando lo inicié y el script anterior que escribí que solía conectarse ahora mostró el botón de reproducción como deshabilitado. La salida del MT IDE se mostró como "Conexión establecida en el simulador de iOS", pero no se puede seleccionar el botón ejecutar / reproducir.

El proyecto original tenía "ObjC -all_load" en las Otras Banderas de Enlace y cuando agregué "-all_load -lstdc ++" junto con él, recibí el mensaje de error sobre el que trata esta publicación. Cuando eliminé el "ObjC -all_load" y solo agregué el "-all_load -lstdc ++" que el proyecto construyó, pero aún no se cierra la sesión de talk talk como confirmación en la consola


2

Es posible que esté utilizando una biblioteca que solo está compilada para hardware REAL. Por ejemplo, si está utilizando una biblioteca Bluetooth como el Zephyr HxM Smart, probablemente no se compilará en el simulador, y solo debe ejecutarse en dispositivos reales.


1

Se encontró con un problema similar con iOS 6. Pude resolverlo agregando storekit.framework al "Enlace binario con bibliotecas" en la sección de fases de compilación.

Ahora funciona como un encanto.


1

Tengo el mismo problema con 7 errores cuando agrego PSTCollectionviewcontroller. La única solución para este problema es verificar su "xcode -> fases de compilación -> compilar fuentes" aquí agregue todos sus archivos ".m". Espero que esto La publicación ayudará a los usuarios en el futuro.


1

En el mío, estaba usando Cocoapods para un proyecto de Realidad Aumentada y lo que descubrí fue que cuando implementas cocoapods y abres el espacio de trabajo de tu proyecto, terminas con el objetivo del Proyecto Xcode y los objetivos de Pods que implementaste dentro del mismo archivo. Lo que estaba sucediendo era que algunos de los .m estaban siendo utilizados por ambos. Después de eliminar los duplicados para el objetivo Xcode en Build Phases >> Compile Sources, funcionó bien.


1

Descubrí este mensaje ALTAMENTE engañoso al intentar actualizar a la nueva biblioteca de Google Analytics.

En mi caso, el problema era tener DOS COPIAS CONFLICTAS de la biblioteca. Estaban en carpetas diferentes, pero ambas se enumeraron en las Rutas de compilación de la biblioteca de mi aplicación (en Configuración de compilación).

Mover todos los archivos de la biblioteca en desuso de la carpeta terminó haciendo el truco e hizo que los misteriosos mensajes de error desaparecieran.


1

Verifique que todos los recursos de su paquete se copien en la fase de compilación.



1

El cambio en la arquitectura activa funcionó para mí, uno de mis lib estaba usando i386.

En la configuración de compilación >> cambie Build Active Architecture Only a Yes de NO

Funcionó para mi. Espero que ayude a los demás también.

ingrese la descripción de la imagen aquí


"de NO a SÍ" es más fácil de entender. Lo que sea, esto funcionó.
Victor Laerte

0

La respuesta es que simplemente arrastre y suelte la carpeta sobre el proyecto y haga clic en copiar.


0

Recibí este mensaje cuando arrastré y solté algunos archivos fuente de otro proyecto. Cuando los eliminé y luego los agregué a través de "Agregar archivos ..." en el menú Archivo, se creó sin el error.


0

Tuve un error similar con NSManagedObject y fue porque estaba usando Core Data pero me faltaba el marco de Core Data en Build Phases - Link Binary With Libraries, como han respondido algunos otros


Bienvenido a SO Sam. Al responder una pregunta, intente agregar nuevas ideas, investigación o código que no exista en otra respuesta. Si simplemente quiere compartir que otra respuesta funcionó para usted, intente votar o comentar su respuesta en lugar de publicar una respuesta duplicada.
butch

0

Puede obtener este tipo de error si agrega bibliotecas de terceros en su proyecto que requieren marcos nativos no incluidos en su proyecto.

Debe buscar dentro de los archivos .h y .m de su biblioteca recién agregada y ver qué marcos requiere, luego incluir esos marcos en su proyecto (Target> Build Fases> Link Binary With Libraries).


0

Intente eliminar el marco, limpiar el proyecto, agregarlo nuevamente y compilar. O elimine la clase que ha sido agregada por xcode en la fuente de compilación, limpie el proyecto, agréguela nuevamente y luego compile.


0

Recuerde que puede colocar alguna macro en cualquier controlador de vista que llame a los archivos que ya ha eliminado.

La aplicación no mostrará ningún error hasta que cree su aplicación, arrojará el error en la fase de compilación en archivos .o.

Recuerde eliminar cualquier MACRO que llame a los archivos que ya ha eliminado.

Gracias :)


0

Además de lo que hizo Allan, agregando las clases que faltaban, seguí la solución de @ emdog4 y agregué la biblioteca de Core Data al ir a Build Phases en Xcode y bajo 'Link Binary with Libraries' haciendo clic en + y seleccionando 'CoreData.framework' . Esto solucionó mi error

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.