XCode 6.1 Falta la architecture requerida X86_64 en el archivo

En XCode 6.1, recibo un error para iPhone 6, iPhone 5s (iOS 7.1) que dice

Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_ClientAuthenticator", referenced from: objc-class-ref in AppDelegate.o ld: symbol(s) not found for architecture x86_64 linker command failed with exit code 1 

Esto es lo que tengo para la perspectiva de la configuración de la architecture

  Architectures : Standard Architectures(armv7, arm64) - $(ARCHES_STANDARD) Base SDK : Latest iOS(8.1) Valid Architectures: arm64, armv7, armv7s IOS Deployment Target: iOS 6.0 

Recientemente actualicé mi sistema operativo a Yosemite y XCode de 6.0 a 6.1. He buscado en Stackoverflow para esta pregunta que se refiere a XCode 5.1 y probé todas las soluciones dadas, pero nada ha funcionado.

Actualización : Intenté los cambios como se sugiere en la respuesta, pero sigo recibiendo el error que dice ” Falta la architecture requerida X86_64 “. En una investigación posterior, descubrí que el archivo ClientAuthenticator.o que es de mi biblioteca no está siendo construido para la architecture X86_64 y probablemente ese es el problema. Estoy buscando cómo se puede construir para x86_64.

Mi nueva pregunta es ¿cuál es la diferencia entre arm64 y x86_64 ? Parece más la diferencia entre el fabricante de la architecture, pero la architecture básica de 64 bits sigue siendo la misma.

  • Lo primero que debe asegurarse es que su biblioteca estática tenga todas las architectures. Cuando haces un lipo -info myStaticLibrary.a en la terminal, deberías ver las armv7 armv7s i386 x86_64 arm64 para tu binario grueso.

  • Para lograr eso, asumo que está haciendo un binario universal: agregue lo siguiente a su configuración de architecture del proyecto de biblioteca estática –

enter image description here

  • Entonces, puede ver que tengo que configurar manualmente las Standard architectures (including 64-bit) (armv7, armv7s, arm64) del proyecto de biblioteca estática.

enter image description here

  • Alternativamente, dado que el $ARCHS_STANDARD normal ahora incluye 64 bits. También puede hacer $(ARCHS_STANDARD) y armv7s . Compruebe lipo -info sin él, y descubrirá las architectures faltantes. Aquí está la captura de pantalla para todas las architectures:

enter image description here

  • Para su implementación de referencia (proyecto que usa una biblioteca estática). La configuración predeterminada debería funcionar bien –

    enter image description here

Actualización 12/03/14 Xcode 6 Las architectures estándar excluyen armv7s.

Entonces, ¿ armv7s no es necesario? Sí. Parece que las diferencias generales entre los conjuntos de instrucciones armv7 y armv7s son menores. Por lo tanto, si elige no incluir los archivos de armv7s, el código de máquina de aimv7 apuntado sigue funcionando bien en los dispositivos A6 de 32 bits, y apenas uno notará la brecha de rendimiento. Fuente

Si hay una forma más inteligente para Xcode 6.1+ (iOS 8.1 y superior), comparta.

Si está creando una biblioteca universal y necesita admitir el Simulador (x86_64), entonces cree el marco para todas las plataformas estableciendo Build Active Architecture Only en No enter image description here

Muchos usan los scripts de comstackción que se encuentran aquí: http://www.raywenderlich.com/41377/creating-a-static-library-in-ios-tutorial o aquí: https://gist.github.com/sponno/7228256 para su script de ejecución en su objective.

Me estaba tirando de los pelos tratando de agregar x86_64, i386, armv7s, armv7 y arm64 a la sección de Arquitecturas, solo para encontrar que lipo -info targetname.a nunca devuelve estas architectures después de una comstackción exitosa.

En mi caso, tuve que modificar el script de ejecución de destino, específicamente el paso 1 del enlace gist, para incluir manualmente las architectures usando -arch.

Step 1. Build Device and Simulator versions xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator -arch x86_64 -arch i386 -arch armv7 -arch armv7s -arch arm64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

Aquí hay una respuesta a su última pregunta sobre la diferencia entre x86_64 y arm64 :

  • x86_64 architecture x86_64 es necesaria para ejecutar el simulador de 64 bits.

  • arm64 architecture arm64 es necesaria para ejecutar el dispositivo de 64 bits (iPhone 5s, iPhone 6, iPhone 6 Plus, iPad Air, iPad mini con pantalla Retina).

Me encuentro con exactamente el mismo problema y estaba siguiendo este tutorial https://github.com/jverkoey/iOS-Framework#faq

La forma en que hice este trabajo es después de poner los guiones en la fase de comstackción de tu agregado, antes de comstackr, asegúrate de comstackrlo usando un simulador de iphone (usé iPhone6) en lugar de un dispositivo IOS.

que me dará 2 rebanadas: armv7 y x86_64, y luego arrastrar y soltar en el nuevo proyecto funciona bien para mí.

Después de los cambios, tienes que hacer eso (cambiar architecture en armv7 y eliminar otros): –

Cambiar tienes que hacer

Otra cosa a tener en cuenta es que XCode está manejando mal las importaciones de la biblioteca, y en muchos casos la solución es encontrar el archivo importado en su proyecto, eliminarlo en Finder o desde la línea de comandos y volver a agregarlo, de lo contrario no se actualizará correctamente por XCode. Por XCode dejando allí el archivo anterior que sigues corriendo en círculos sin entender por qué no se está comstackndo, falta la architecture, etc.

Mi solución fue conectar mi iPhone 6, construir sobre él y obtuve el proyecto funcionando con éxito.

Porque estaba construyendo para el simulador de iPhone 6.

Uso el comando lipo para combinar dos bibliotecas estáticas construidas manualmente.

EX: Tengo una biblioteca estática (libXYZ.a) para comstackr.

Debug-iphoneos/ construir para el Generic iOS Device y obtuve el producto en Debug-iphoneos/

 $ lipo -info Debug-iphoneos/libXYZ.a Architectures in the fat file: Debug-iphoneos/libXYZ.a are: armv7 arm64 

Luego ejecuto la comstackción para cualquier iOS Simulator y obtuve el producto en Debug-iphonesimulator/

 $ lipo -info Debug-iphonesimulator/libXYZ.a Architectures in the fat file: Debug-iphonesimulator/libXYZ.a are: i386 x86_64 

Finalmente me combino en uno para contener todas las architectures.

 $ lipo -create Debug-iphoneos/libXYZ.a Debug-iphonesimulator/libXYZ.a -output libXYZ.a $ lipo -info libXYZ.a Architectures in the fat file: libXYZ.a are: armv7 i386 x86_64 arm64 

Si tiene este problema en proyectos de reacción nativa con una biblioteca externa. Debería eliminar el proyecto y usar react-native link . Eso debería resolver el problema.