2012-05-29 13 views
65

Tengo que construir la biblioteca estática. Quiero usar en mi aplicación de iPhone y ipad. Cuando trato de ejecutar el simulador obtengo errores de enlace. Soy nuevo en el desarrollo de iOS. amablemente ayuda;archivo fue creado para el archivo que no es la arquitectura que se está vinculando (i386)

ld: warning: ignoring file /Users/valuelabs/Desktop/DruvaProject/libraries/libnetUtils.a, file was built for archive which is not the architecture being linked (i386) Undefined symbols for architecture i386:
"_OBJC_CLASS_$_netUtils", referenced from: objc-class-ref in ViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Intenté agregar i386 en las Arquitecturas. pero sin suerte

Respuesta

67

Después de luchar con este mismo problema y siguiendo todas las respuestas aceptadas de la actualización de la configuración de creación, despejando el camino de búsqueda enlazador, etc .. Finalmente descubrí una respuesta que funcionó para mí.

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

Antes:

iOS Device Settings

Después:

iPhone 5.1 Simulator Settings

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

Espero que esto ayude.

+0

Esto lo resolvió para mí. ¡Hay muchas maneras de construir para una arquitectura que no tiene la intención, y es posible que los buscadores futuros deseen consultar muchas de estas respuestas para ver si se encuentra con la que se aplica a usted! – Danny

+0

Actualización: Después del simulador de xcode 5 y iPhone de 64 bits, tengo un error con libPods.a que se está creando para otra arquitectura, pero no ocurre en otros tipos de simuladores: \ – Nour1991

+12

@ Nour1991 intente configurar 'Configuraciones de compilación - > Construir arquitectura activa solamente' a 'No' – MMiroslav

5

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

9

Yo en realidad no sé si mi consejo es correcto, pero trata de leer esto:

  • Seleccione el proyecto
  • Seleccione "Configuración de creación"
  • Verificar Arquitecturas:
    • arquitecturas válidos debería ser "armv6 armv7"
    • Las plataformas compatibles deberían ser "iPhonesimulator iphoneos" (tal vez iPad, no sé)
    • Base SDK - tu iOS SDK (tengo iOS 5.0).

no me juzgues si yo soy el capitán obvio :)

+15

Además del consejo de Alexander, le aconsejaría que se asegure de que la configuración 'Construir arquitectura activa solamente' esté configurada en 'NO'. Esto me hizo tropezar recientemente. – TPoschel

-2

Tenía una arquitectura de armv7s también. Lo borré y me aseguré de que armv6 y armv7 fueran los únicos dos en la lista. Funciona ahora

+0

No debe excluir armv7s –

24

Su libnetUtils.a se está construyendo para una arquitectura diferente a su destino.

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 destino.La complejidad aquí es que la arquitectura resultante se distribuye en varias configuraciones: "Arquitecturas", "Construir arquitectura activa solamente" y "Arquitecturas válidas".

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

19

Si consigo la advertencia de archivo ignorar - Yo corría lipo -info en el archivo ignorado para encontrar su arquitectura como por debajo

lipo -info libnetUtils.a 

Eso sería imprimir cualquiera de i386, ARMv6, ARMv7, armv7s, x86_64 etc. En general , esa arquitectura tiene que coincidir con su plataforma de construcción de destino. P.ej.

  • i386 = ios simulador o 32 bit se basan en Mac OS x
  • ARMv6 arm7s ARMv7 = ios dispositivo
  • x86_64 = 64 bit construir en Mac OS X

Dependiendo de la falta de coincidencia, o bien tiene que reconstruir su biblioteca para su plataforma objetivo o cambiar su plataforma objetivo.

Nota: Para los binarios gordos, lipo -info imprimirá una combinación de las arquitecturas anteriores.

+1

Aunque, esto no respondió al OP. Esta es una gran herramienta para depurar este problema. Lo que me gustaría saber es, ¿cómo construir un binario con todas las arquitecturas mencionadas? –

+0

No importa, encontré la respuesta aquí: http://stackoverflow.com/questions/2793392/how-do-i-compile-a-static-library-fat-for-armv6-armv7-and-i386 que usa lipo para combinar compilaciones utilizando la marca '-create' –

1

Tenía el mismo problema, y ​​probé diversas soluciones de la página en vano. Todavía tenía un mensaje que decía que mi biblioteca no estaba compilada para arm64.

Finalmente cómo lo resolví:

  • abrió la project.pbxproj para la biblioteca en un editor de texto
  • buscado VALID_ARCHS
  • había 4 ocurrencias, 2 de los cuales no contener arm64
  • manualmente agregué arm64 en la cadena (VALID_ARCHS = "arm64 i386 armv7 armv7s")
  • reconstruir la lib y estaba bien

Parece que a veces la configuración de compilación que muestra XCode es incompleta y no se corresponde exactamente con el archivo del proyecto.

41

A veces este tipo de errores te irrita!

Extracción Derivado de datos funciona para mí:

Pasos para corregir

1) En XCODE> Windows> Proyecto> Seleccione el proyecto> Borrar datos derivados> Salir XCODE y volver a abrirlo> Si recibe MAC- O-Linker builed error failed> Refere this link> Limpiar y compilar de nuevo.

+0

Para eliminar datos derivados en XCode 8, consulte aquí: http://stackoverflow.com/questions/38016143/how-to-delete-derived-data-in-xcode-8 –

0

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

Cuestiones relacionadas