Símbolos indefinidos para arquitectura armv7

307

Este problema me ha vuelto loco, y no puedo encontrar la manera de solucionarlo ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Creo que tiene que ver con:

ld: symbol(s) not found for architecture armv7

Pero he agregado: libz.1.2.3.dyliby no está ayudando, ¿alguien tiene alguna idea?

Alex Trott
fuente
Otra posibilidad que no está cubierta en ninguna de las respuestas existentes es que podría estar usando el -ObjCotro indicador de enlace y, por lo tanto, Obj-C de las bibliotecas estáticas externas que está usando que no deberían ser visibles (como las de Parse), son visibles. Vea mi respuesta si este es el caso: stackoverflow.com/a/26151208/901641
ArtOfWarfare
2
Como regla general, a veces XCode proporciona el tipo de errores como Match-O y el símbolo no encontrado para la arquitectura i386 (u otra) cuando los archivos no se agregaron al proyecto. Puede hacer clic derecho en la carpeta del proyecto y hacer "Agregar archivo a <proyecto>".
Fabricio PH
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
¿Puede alguien aquí ayudarme? Recibo el siguiente error, pero ninguna de las soluciones anteriores me funciona. Ya he pasado días con todas las configuraciones posibles. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
diablo rojo

Respuestas:

506

Causas comunes

Las causas comunes de "Símbolos indefinidos para arquitectura armv7" son:

  1. Usted importa un encabezado y no enlace con la biblioteca correcta . Esto es común, especialmente para los encabezados de bibliotecas como QuartzCore, ya que no se incluye en los proyectos de forma predeterminada. Resolver:

    • Agregue las bibliotecas correctas en la Link Binary With Librariessección de Build Phases.

    • Si desea agregar una biblioteca fuera de la ruta de búsqueda predeterminada, puede incluir la ruta en el Library Search Pathsvalor en la Configuración de compilación y agregar
      -l{library_name_without_lib_and_suffix}(por ejemplo, para uso de libz.a -lz) a la Other Linker Flagssección de Build Settings.

  2. Usted copiar archivos en su proyecto, pero se olvidó de comprobar el destino para añadir los archivos a . Resolver:

  3. Usted también dispone de biblioteca estática que se construye para otra arquitectura como i386, el simulador en el equipo anfitrión. Resolver:

    • Si tiene que incluir varios archivos de la biblioteca de su proveedor de bibliotecas en el proyecto, debe incluir el del simulador (i386) y el del dispositivo (por ejemplo, armv7).

    • Opcionalmente, puede crear una biblioteca estática gruesa que contenga ambas arquitecturas.



Respuesta original

No se ha vinculado con el archivo libz correcto. Si hace clic derecho en el archivo y revela en el buscador, su ruta debe estar en algún lugar de una carpeta sdk de iOS. Aquí está el mío, por ejemplo.

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Recomiendo eliminar la referencia y luego volver a agregarla en la sección Enlace binario con bibliotecas Fases de compilación de su destino.

Joe
fuente
44
También puede deberse a que necesita agregar la palabra "-licucore" en la configuración del proyecto / Otros indicadores de vinculador. Se agregó automáticamente para mi compilación de depuración, pero no para el lanzamiento, por lo que no se compilaría.
JulianB
44
Tuve el mismo problema. Realmente no leí las notas de instalación correctamente, así que no me di cuenta de que la nueva versión de bugsense necesita el binario libz agregado en las fases de construcción.
Max MacLeod
2
¿Está seguro de que ha incluido una sección @implementation en su archivo .m respectivo para todas las clases que ha declarado en su archivo de encabezado?
slcott
77
Solo quiero agregar que creo que fue muy respetuoso de su parte hacer referencia a otra respuesta a esta pregunta y decirnos que votemos si eso ayudó.
Andrew
¡Gracias por la ayuda! :) Para me ayudó a escribir de forma explícita en la sección Otros Banderas Enlazador: -framework <FrameWorkName>. Tuve problemas con XCTest, así que tuve que agregar -framework XCTest. ¡Gracias! :)
piotr_ch
198

Tuve un problema similar anoche y el problema estaba relacionado con el hecho de que había arrastrado una clase del Finder a mi proyecto en Xcode.

La solución fue ir a la pestaña Fases de compilación y luego a Compilar fuentes y asegúrese de arrastrar la clase a la lista.

Corteza
fuente
66
Desearía haberme dado cuenta de que esta era la respuesta que estaba buscando antes. Alternativamente, puede asegurarse de marcar 'Agregar a objetivos' al copiar clases.
T. Markle
1
Whoa ... ¡me alegro de que la solución fuera tan fácil! Para ser claros, si agrega una clase arrastrándola desde el buscador a su proyecto, XCode no siempre las agrega a su lista de fases de construcción aparentemente. Simplemente presioné el botón "+" en "Compilar fuentes" en las fases de compilación, agregué todos los archivos ofensivos y lo compilé de inmediato.
Amós
1
Guau. Apple realmente necesita reconsiderar sus mensajes de error.
devios1
2
Otra forma de solucionar esto es seleccionar el archivo que se dice que falta. y abra la barra deslizante "Utilidades". (Esa es la extrema derecha) Y elija el "Inspector de archivos". Luego, asegúrese de que haya una verificación en el proyecto en "Membresía de destino". Estoy usando Xcode 4.6.2
zingle-dingle
1
No sabía qué archivo faltaba, así que mostré las Fases de compilación en el editor asistente (la segunda vista de edición). Abrí el archivo ofensivo en la vista de edición izquierda y verifiqué que cada uno de los archivos importados existía en Build Phases. Agregué el que no lo hizo y se resolvió.
Dan Sandland
38

Tuve un problema similar y tuve que marcar "Construir solo arquitectura activa" en cada una de las configuraciones del proyecto (depuración, lanzamiento e implementación) y en la configuración de compilación del destino.

Alex Zavatone
fuente
3
También hizo el truco para mí. Sin embargo, solo era necesario en el proyecto principal.
Kirualex
44
Me encuentro con los mismos problemas. La Build Active Architecture Onlyconfiguración es diferente entre Podsy mi proyecto. En la etapa de enlace, falló.
AechoLiu
14

Tuve un problema similar con eso. El nombre de la clase después de _OBJC_CLASS _ $ _ era en realidad mi clase. La razón fue que no marqué "Agregar al destino" cuando arrastré los archivos de código fuente a la lista de navegación.

Mi solución fue:

  1. elimine la clase de la lista de navegación y elija "eliminar solo referencia"

  2. arrastre los archivos de código fuente nuevamente y asegúrese de que la casilla de verificación "agregar a destino" esté marcada. La casilla está justo debajo de "Copiar si es necesario" y "Crear grupo".

syoleen
fuente
Solo para agregar: aunque esta NO ES LA CAUSA MÁS COMÚN del error, solo su respuesta (no marcó la casilla) me sucede ahora.
Adam
8

Generalmente hay un alias sin el identificador de versión que está vinculado a la versión actual, en este caso libz.dylib está vinculado a libz.1.2.5.dylib. Use el alias base en lugar del versionado.

zaph
fuente
5

En Target -> Build Settings -> Apple LLVM compiler language: la configuración de 'C ++ Language Dialect' y 'C ++ Standard Library' al valor predeterminado del compilador ayudó a resolverlo.

usuario1368045
fuente
5

Solo agregué libz.1.2.5.dylib a mi proyecto y funcionó de maravilla.

pasos -

  1. Ir a construir fases.
  2. Enlace binario con biblioteca: use el botón '+' para elegir marcos y bibliotecas para agregar.
  3. Seleccione libz.1.2.5.dylib de la lista.
  4. Construye y corre.
girish_vr
fuente
5

Tuve un problema similar y vi errores relacionados con "std ::"

Cambié la Configuración de compilación -> Apple LVM 5.0 - Lenguaje C ++ -> Biblioteca estándar de C ++

de libc ++ (Biblioteca estándar LLVM C ++ con soporte C ++ 11) a libstdc ++ (Biblioteca estándar GNU C ++)

Andrew Soltan
fuente
5

Tuve el mismo problema cuando uso la biblioteca admob, lo arreglé cambiando "Arquitecturas" a "Arquitecturas estándar armv7, armv7s" sin incluir 64 bits. Configuración de compilación

pabloverd
fuente
4

Tengo varias @interfaces en el archivo .h y aún no había incluido todas las directivas de @implementation correspondientes. Asegúrese de que todos estén equilibrados.

James
fuente
4

Si tienes la bandera -ObjC debajo de Destino> Configuración de compilación> Otros indicadores de vinculador y está teniendo este problema, considere eliminarlo. Si lo agregó intencionalmente porque necesita cargar un código Obj-C de una biblioteca estática que normalmente no se cargaría de otra manera, IE, una categoría Obj-C, entonces debería usarlo en -force_load <path>lugar de -ObjC.

<path>debe ser relativo a su directorio de proyectos Xcode. IE, si su estructura de directorios se ve así:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Entonces deberías tener esta bandera establecida para Other Linker Flags :

-force_load iOSAPI.framework/iOSAPI

Si desea incluir varias bibliotecas como esa, debe incluir una -force_loadlínea separada para cada una de ellas.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
ArtOfWarfare
fuente
4

Así es como llegué a este problema:

Agregué un .h, .my NIB de otro proyecto arrastrándolos a mi navegador de proyectos. Xcode no los agregó a las fases de compilación correctamente.

Verifique mi respuesta porque tuve un problema similar que pude resolver siguiendo algunos pasos.

Himanshu Agnihotri
fuente
3

si está tratando con la actualización de iOS5, descubrí que para compilar un proyecto escrito en el objetivo 4.3, podría cambiar el nombre de libz.1.2.3.dynlib en Project Navigator a libz.1.2.5.dynlib y se compiló.

Mi carpeta iPhoneOS50SDK / usr / lib no tiene libz.1.2.3.dynlib: no sé si es una versión beta o simplemente una actualización natural.

Stan
fuente
3

Vaya a su proyecto, haga clic en Fases de compilación, compile fuentes, agregue GameCenterManager.m a la lista.

Dhaval Sarvaiya
fuente
3

Probablemente faltan algunas clases de su objetivo. Esto suele suceder cuando cambia el nombre / elimina / agrega nuevos archivos de clases a su proyecto. Para solucionarlo, agregue las clases recién agregadas a algunos objetivos.

Seleccione la clase en el Navegador de proyectos (barra lateral derecha), abra la barra lateral Utilidades (barra lateral derecha), desde las Utilidades seleccione el Inspector de archivos (icono como archivo), debajo de la pestaña Membresía de destino marque sus objetivos. Esto es todo para evitar el "Eliminar referencia" y agregar nuevamente con el truco "Agregar a objetivos".

Por lo tanto: Seleccione Clase -> Utilidades (Inspector de archivos) -> Membresía de destino -> Marque los objetivos que desee.

andrei
fuente
2

No encontré esta sugerencia aquí, así que aquí va: si su proyecto tiene más de un objetivo (es decir, uno para OSX y uno para iOS), debe vincular las bibliotecas relevantes para cada objetivo ... por ejemplo, en mi caso, yo necesitaba AudioToolbox ... Tuve que agregarlo una vez para OSX y una vez para iOS (en la carpeta de frameworks , debe tener un duplicado de cada biblioteca para cada destino ... si ve solo uno ... entonces eso es una bandera roja)

abbood
fuente
Esta respuesta me ayudó. Sin embargo, mi situación era aún más directa ... Simplemente olvidé agregar un marco al que hacía referencia mi base de código. En mi caso, no pude cargar AVFoundation.framework.
John Erck
Sí, simplemente olvidé agregar un marco en la fase "Enlace binario con bibliotecas".
Max
2

Estaba enfrentando un problema con las bibliotecas PJSIP,

Intenté lo siguiente en otros indicadores de enlazador en el proyecto y pude resolver el error: -framework Foundation -framework UIKit

Las banderas de enlace anteriores se usan en Siphone Project sobre github . Esta configuración lo ayudará a resolver problemas relacionados con el enlace de bibliotecas C ++.

Adeesh Jain
fuente
Tengo el mismo problema con las bibliotecas de PJSIP. ¿Puede explicar la solución en detalle
Rajat Jain
Establezca los siguientes valores en otros indicadores de enlace de la configuración de construcción del proyecto: -framework Foundation -framework UIKit
Adeesh Jain
Mensaje de error: ignorando el archivo /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, el archivo se creó para el archivo que no es la arquitectura que se está vinculando (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Símbolos indefinidos para arquitectura i386: "_pjsip_register_method", referenciado desde:
Rajat Jain
Parece que está intentando ejecutar la aplicación en el simulador y libyuv.a no está diseñado para la arquitectura del simulador i386. intente ejecutar la aplicación en el dispositivo directamente
Adeesh Jain
Quiero integrar Pjsip en Swift. Intenté crear encabezados de puente pero no funcionó. ¿Me puedes dar alguna idea?
Rajat Jain
1

Finalmente lo he resuelto, resolví este problema agregando un marco ausente al objetivo-> Construir fases-> Enlace binario con bibliotecas

lomec
fuente
1

Una vez tuve este problema. Me di cuenta de que al mover una clase, había sobrescrito el .mmarchivo con.h archivo en la carpeta de destino.

Arreglar ese problema solucionó el error.

usuario2158690
fuente
1

Recibí el error 'Símbolos indefinidos para arquitectura armv7:' al intentar compilar un proyecto que tenía la configuración de compilación de destino para 'Biblioteca estándar de C ++' establecida en 'libc ++' (necesario ya que el proyecto estaba usando algunas características de C ++ 11), y el proyecto incluía un subproyecto que tenía la misma configuración establecida en 'libstdc ++' (o el valor predeterminado del compilador como está actualmente).

Al cambiar la configuración de 'Biblioteca estándar de C ++' del subproyecto a libc ++, se solucionó, pero solo después de establecer primero el objetivo de implementación del subproyecto en 5.0 o superior (5.0 es necesario para libc ++).

Si.
fuente
1

Le doy más sugerencias que puede verificar cuando otras sugerencias comunes no son de ayuda.

Si se vincula con otro proyecto (libxxx.a), a veces puede encontrar un problema extraño en el que puede encontrar el símbolo con herramientas como nm pero simplemente no pueden encontrar los símbolos en ld. Luego debe verificar si los dos proyectos están construidos en las mismas banderas, algunos de ellos pueden afectar el formato binario.

  1. compruebe el compilador de c ++.
  2. compruebe la configuración del dialecto c ++.
  3. compruebe el soporte de tipo de tiempo de ejecución de c ++. (-frtti / -fnortti)
  4. compruebe si hay un .a con el mismo nombre en otro lugar, podría estar más allá del archivo deseado en la lista de rutas de enlace. eliminarlos
casualidad
fuente
1

Tengo este problema cuando ejecuto la aplicación en iphone5s , se resolvió agregando arm64 a Arquitecturas .

alexqinbj
fuente
1

Yo tuve el mismo problema. Intenté todo desde la enorme lista de respuestas, pero al final mi problema fue: estoy trabajando con openCV, así que necesito combinar el código C ++ en mi código. Para hacer esto, debe cambiar los archivos que usan Objective-C y C ++ a .mm. No cambié un archivo y este archivo no tiene conexión con el código C ++, pero tuve que cambiarlo.

usuario2743760
fuente
1

Tuve este problema al instalar shareKit. Funcionó en el simulador, pero no en el dispositivo. Eliminé -all_load del Otro Linker Flag y todo funciona bien tanto en el simulador como en el dispositivo iphone.

Jordán
fuente
1

En mi caso, agregué un marco que debe estar usando Objective C ++. Encontré esta publicación:

XCode .m vs. .mm

eso explicaba cómo era necesario cambiar el nombre de main.m a main.mm para poder compilar también las clases Objective-C ++.

Eso me lo arregló.

Vito Andolini
fuente
1

Solía ​​enfrentar ese problema cuando el módulo (archivo .m) no está en el destino con el que estoy trabajando.

Javier Calatrava Llavería
fuente
1

Para mí, el problema fue que olvidé establecer el valor de mis constantes en el .m (implementación)

file const kFooKey = @"Foo";
Jakub Truhlář
fuente
1

También agregué archivos a través de arrastrar y soltar. Lo que hice, eliminé las referencias de todos los archivos (excluyendo frameworks) y luego las agregué nuevamente de manera adecuada a través de la opción Agregar archivos al proyecto , el problema desapareció.

Vaibhav Saran
fuente
1

Si está compilando desde Unity3D 5 y también está utilizando un complemento Prime31 y obtiene este error, probablemente se deba a un duplicado .dll. Si revisa sus advertencias en el editor de Unity, una de ellas le dirá esto y le advertirá que podría causar errores de compilación. Para ver si este es el caso, escriba P31 en el campo de búsqueda de su proyecto y debería aparecer de inmediato, tal vez incluso más de uno. Los duplicados tendrán un '1' al final del nombre del archivo. Esto probablemente se deba a la actualización del complemento en el editor a través de la tienda o la pestaña del menú Prime31.

Dela Torre
fuente