el archivo fue creado para un archivo que no es la arquitectura que se está vinculando (i386)

79

Tengo que construir una biblioteca estática. Quiero usarlo en mi aplicación para iPhone y ipad. Cuando intento ejecutar el simulador, obtengo errores de enlace. Soy nuevo en el desarrollo de iOS. amablemente ayuda

ld: advertencia: ignorando el archivo /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, el archivo fue creado para el archivo que no es la arquitectura que se está vinculando (i386) Símbolos indefinidos para la arquitectura i386:
"_OBJC_CLASS _ $ _ netUtils", referenciado desde : objc-class-ref en ViewController.o ld: símbolo (s) no encontrado para la arquitectura i386 clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación)

Intenté agregar i386 en Architectures. pero no suerte

yarlg
fuente

Respuestas:

77

Después de luchar con este mismo problema y seguir todas las respuestas aceptadas de actualizar la configuración de compilación, borrar la ruta de búsqueda del vinculador, etc. Finalmente descubrí una respuesta que funcionó para mí.

Antes de construir, asegúrese de seleccionar el tipo correcto (iPhone Simulator) en lugar de Dispositivo iOS. Luego reconstruir. De lo contrario, está intentando utilizar una biblioteca creada para un dispositivo iOS (procesador de brazo) en un simulador de su mac (i386). Debería haber sido obvio, pero no lo fue.

Antes de:

Configuración del dispositivo iOS

Después:

Configuración del simulador de iPhone 5.1

Ahora, busque en el grupo Productos en el Navegador> haga clic con el botón derecho en su biblioteca estática (archivo .a)> Mostrar en el Finder, notará que está en una carpeta Debug-iphonesimulator en lugar de Debug-iphoneos. No presté atención al nombre de la carpeta originalmente, o podría haber pensado en esto antes.

Espero que esto ayude.

Cody A. Ray
fuente
Esto me lo resolvió. Hay muchas formas de construir para una arquitectura que no está intentando y los futuros buscadores pueden querer revisar muchas de estas respuestas para ver si encuentra la que se aplica a usted.
Danny
Actualización: después de xcode 5 y el simulador de iPhone de 64 bits, tengo un error con libPods.a que se está construyendo para otra arquitectura, pero no sucede en otros tipos de simuladores: \
Nour1991
13
@ Nour1991 intente configurar Build Settings -> Build Active Architecture OnlyenNo
MMiroslav
@MMiroslav tuve que ponerlo en sí, porque necesito implementar en depuración.
Pedro Romão
42

¡A veces este tipo de errores te irrita!

Eliminar datos derivados funciona para mí:

Pasos para arreglar

1) En XCODE> Windows> Proyecto> Seleccione su proyecto> Eliminar datos derivados> Salga de XCODE y vuelva a abrirlo> Si obtiene un error de compilación de MAC-O-Linker> Consulte este enlace> Limpiar y compilar nuevamente.

Gajendra K Chauhan
fuente
1
Para eliminar datos derivados en XCode 8, consulte aquí: stackoverflow.com/questions/38016143/…
Dan Carlson
28

Tu libnetUtils.ase está construyendo para una arquitectura diferente a la de tu objetivo.

Compruebe la configuración de compilación de libnetUtils. Las arquitecturas para las que se está construyendo y su lista de arquitecturas compatibles deben ser un superconjunto (débil) de la arquitectura de su objetivo. La complejidad aquí es que la arquitectura resultante se distribuye en varias configuraciones: "Arquitecturas", "Construir solo arquitectura activa" y "Arquitecturas válidas".

La configuración de "Construir solo arquitectura activa" hace que esto sea particularmente confuso. Por ejemplo, suponga que está construyendo para el simulador. Si la opción "Construir solo arquitectura activa" para Depurar está establecida en NO, se construirán todas las arquitecturas enumeradas en "Arquitecturas" y "Arquitecturas válidas" (probablemente armv7, etc.). Pero si libnetUtils tiene esa configuración establecida en Sí (Depurar: Sí), solo se está compilando para i386. Entonces, cuando su enlazador intenta vincular armv7 con i386, falla.

achow
fuente
26

Si recibo la advertencia de ignorar archivo, me ejecutaría lipo -infoen el archivo ignorado para encontrar su arquitectura como se muestra a continuación

lipo -info libnetUtils.a

Eso imprimiría i386, armv6, armv7, armv7s, x86_64, etc. En general, esa arquitectura debe coincidir con la plataforma de compilación de destino. P.ej

  • i386 = simulador ios o compilación de 32 bits en mac os x
  • armv6 armv7 arm7s = dispositivo ios
  • x86_64 = compilación de 64 bits en mac os x

Dependiendo de la falta de coincidencia, debe reconstruir su biblioteca para su plataforma de destino o cambiar su plataforma de destino.

Nota: Para binarios pesados, lipo -infoimprimirá una combinación de arquitecturas anteriores.

Kiran
fuente
2
Aunque, esto no respondió al OP. Esta es una gran herramienta para depurar este problema. Lo que me gustaría saber es, ¿cómo se construye un binario con todas las arquitecturas mencionadas anteriormente?
Jay Q.19 de
No importa, encontré la respuesta aquí: stackoverflow.com/questions/2793392/… que usa lipo para combinar compilaciones usando la bandera '-create'
Jay Q.
ld: advertencia: compilando para iOS-armv7 pero intentando vincular con el archivo creado para iOS-arm64 Símbolos indefinidos para la arquitectura armv7 esta advertencia lleva a clang: error: el comando del vinculador falló con el código de salida 1 (use -v para ver la invocación) este error . Si está utilizando su propia biblioteca / marco, cambie esto tanto en la Biblioteca del proyecto como en el Adoptador. Configuración de compilación -> Construir arquitectura activa solo para No
Shrikant Phadke
Consulte medium.com/@edisonlo/…
Shrikant Phadke
9

En realidad, no sé si mi consejo es correcto, pero intente verificar esto:

  • Seleccione su proyecto
  • Seleccione "Configuración de compilación"
  • Ver arquitecturas:
    • Las arquitecturas válidas deben ser "armv6 armv7"
    • Las plataformas compatibles deberían ser "iphonesimulator iphoneos" (tal vez iPad, no lo sé)
    • Base SDK: su SDK de iOS (tengo iOS 5.0).

No me juzgues si soy capitán obvio :)

Alexander Bekert
fuente
17
Además del consejo de Alexander, le aconsejo que se asegure de que la configuración 'Construir solo arquitectura activa' esté establecida en 'NO'. Esto me hizo tropezar recientemente.
TPoschel
5

Significa que la biblioteca que está intentando usar no se compiló universalmente para el simulador de iOS (los símbolos i386 son para Mac). Sin embargo, ejecutarlo en un dispositivo real debería funcionar bien.

CodaFi
fuente
3

Tuve el mismo problema y probé diversas soluciones desde la página sin éxito. Todavía tenía un mensaje que me decía que mi biblioteca no estaba construida para arm64.

Finalmente como lo resolví:

  • abrió el project.pbxproj para la biblioteca en un editor de texto
  • buscado VALID_ARCHS
  • hubo 4 apariciones, 2 de las cuales no contenían arm64
  • Agregué manualmente arm64 en la cadena (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • reconstruir la biblioteca y estuvo bien

A veces, parece que la configuración de compilación que muestra XCode está incompleta y no corresponde exactamente al archivo del proyecto.

Eino Gourdin
fuente
3

También debe verificar si el destino de implementación dentro de la configuración de compilación es el mismo para dependientes y dependencias. Noté que tenía iOS 13 configurado para un destino de biblioteca estática, mientras que iOS 10.0 se definió para un marco que consume esa biblioteca. Cambiar ambos a 10.0 resolvió el problema.

GeRyCh
fuente
Revisé todas las otras sugerencias sobre esta pregunta, esta fue la que me hizo tropezar
richy
0

Para mí, se fijó la configuración de Build Active Architecture Onlyto Multiple values, para hacer eso, tienes que expandirlo y establecer Debugto YESy Releaseto No. Y ahora, se compila en mi dispositivo.

JESERRANO
fuente
-1

Este problema no ocurrirá cuando ejecutemos la aplicación en el dispositivo. Puede verificarlo ejecutando el código en el dispositivo iOS.

Chandni - Systematix
fuente
-2

También tenía una arquitectura de armv7s. Lo borré y me aseguré de que armv6 y armv7 fueran los únicos dos en la lista. Ahora funciona

volantes
fuente
No debe excluir armv7s
Maciej Swic