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.dylib
y no está ayudando, ¿alguien tiene alguna idea?
-ObjC
otro 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/901641nm -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. nm -g file.o Puede inspeccionar los símbolos de C ++ exigidos con esto: nm -gC file.oUndefined 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)
Respuestas:
Causas comunes
Las causas comunes de "Símbolos indefinidos para arquitectura armv7" son:
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 Libraries
sección deBuild Phases
.Si desea agregar una biblioteca fuera de la ruta de búsqueda predeterminada, puede incluir la ruta en el
Library Search Paths
valor 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 laOther Linker Flags
sección deBuild Settings
.Usted copiar archivos en su proyecto, pero se olvidó de comprobar el destino para añadir los archivos a . Resolver:
Build Phases
para el objetivo correcto, expandaCompile Sources
y agregue los.m
archivos que faltan . Si este es tu problema, vota la respuesta de Cortex a continuación también.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.
Recomiendo eliminar la referencia y luego volver a agregarla en la sección Enlace binario con bibliotecas Fases de compilación de su destino.
fuente
-framework <FrameWorkName>
. Tuve problemas con XCTest, así que tuve que agregar-framework XCTest
. ¡Gracias! :)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.
fuente
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.
fuente
Build Active Architecture Only
configuración es diferente entrePods
y mi proyecto. En la etapa de enlace, falló.Otra posible causa de errores de enlazador de "símbolo indefinido" es intentar llamar a una función C desde un archivo .mm. En este caso, deberá usar "C" externa ... para importar los archivos de encabezado.
Error del enlazador al llamar a la función C desde Objective-C ++
fuente
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:
elimine la clase de la lista de navegación y elija "eliminar solo referencia"
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".
fuente
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.
fuente
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.
fuente
Solo agregué libz.1.2.5.dylib a mi proyecto y funcionó de maravilla.
pasos -
fuente
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 ++)
fuente
Tuve el mismo problema cuando uso la biblioteca admob, lo arreglé cambiando "Arquitecturas" a "Arquitecturas estándar armv7, armv7s" sin incluir 64 bits.
fuente
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.
fuente
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í:Entonces deberías tener esta bandera establecida para
Other Linker Flags
:Si desea incluir varias bibliotecas como esa, debe incluir una
-force_load
línea separada para cada una de ellas.fuente
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.
fuente
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.
fuente
Vaya a su proyecto, haga clic en Fases de compilación, compile fuentes, agregue GameCenterManager.m a la lista.
fuente
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.
fuente
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)
fuente
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 ++.
fuente
Finalmente lo he resuelto, resolví este problema agregando un marco ausente al objetivo-> Construir fases-> Enlace binario con bibliotecas
fuente
Una vez tuve este problema. Me di cuenta de que al mover una clase, había sobrescrito el
.mm
archivo con.h
archivo en la carpeta de destino.Arreglar ese problema solucionó el error.
fuente
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 ++).
fuente
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.
fuente
Tengo este problema cuando ejecuto la aplicación en iphone5s , se resolvió agregando arm64 a Arquitecturas .
fuente
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.
fuente
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.
fuente
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ó.
fuente
Solía enfrentar ese problema cuando el módulo (archivo .m) no está en el destino con el que estoy trabajando.
fuente
Para mí, el problema fue que olvidé establecer el valor de mis constantes en el .m (implementación)
fuente
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ó.fuente
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.
fuente