Xcode 5 y iOS 7: Arquitectura y arquitecturas válidas

82

Estoy comenzando un nuevo proyecto en Xcode 5. Quiero desarrollar aplicaciones usando iOS SDK 7pero con destino de implementación iOS 5.0. Tan pronto como creo un nuevo proyecto en Xcode e intento cambiar el objetivo de implementación a 5.0, recibo este mensaje:

Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.

Así que cambió las arquitecturas a Standard(sin 64 bits). Yo compilo, se ejecuta pero realmente no entiendo lo que acaba de pasar.

¿Cuál es la diferencia entre la configuración Architecturesy Valid architecturesen la configuración de compilación del proyecto Xcode?
Si configuro Architecturespara excluir 64 bits, ¿qué sucede cuando ejecuto mi aplicación en un iPhone de 64 bits o un simulador de iOS (sé que funciona, solo tengo curiosidad por saber qué sucede debajo)?
¿Puede explicar el gran lío con la nueva arquitectura de 64 bits?

ingrese la descripción de la imagen aquí

Yogur loco
fuente
¿Has mirado en los foros de desarrolladores de Apple? Hay muchas publicaciones sobre esto. devforums.apple.com/message/887506#887506
trojanfoe

Respuestas:

123

Establecer la arquitectura en la configuración de compilación en arquitecturas estándar (armv7, armv7s)

ingrese la descripción de la imagen aquí

El iPhone 5S funciona con un procesador A7 de 64 bits. De los documentos de Apple

Xcode puede crear su aplicación con binarios de 32 y 64 bits incluidos. Este binario combinado requiere un objetivo de implementación mínimo de iOS 7 o posterior.

Nota: Una versión futura de Xcode le permitirá crear una sola aplicación que admita el tiempo de ejecución de 32 bits en iOS 6 y posterior, y que admita el tiempo de ejecución de 64 bits en iOS 7.

De la documentación lo que entendí es

  • Xcode puede crear ambos binarios de 64 bits y 32 bits para una sola aplicación, pero el objetivo de implementación debe ser iOS7. Dicen que en el futuro será iOS 6.0
  • El binario de 32 bits funcionará bien en el iPhone 5S (procesador de 64 bits).

Actualización (Xcode 5.0.1)
En Xcode 5.0.1 agregaron el soporte para crear binarios de 64 bits para iOS 5.1.1 en adelante.

Xcode 5.0.1 puede crear su aplicación con binarios de 32 y 64 bits incluidos. Este binario combinado requiere un objetivo de implementación mínimo de iOS 5.1.1 o posterior. El binario de 64 bits se ejecuta solo en dispositivos de 64 bits que ejecutan iOS 7.0.3 y posterior.

Actualización (Xcode 5.1)
Xcode 5.1 realizó un cambio significativo en la sección de arquitectura. Esta respuesta será un seguimiento para ti. Mira esto

Anil Varghese
fuente
Como he escrito en mi pregunta, ya lo he hecho. Mi pregunta es más sobre qué cambia y qué sucede debajo.
Crazy Yoghurt
acerca de la edición: ¿Entonces se trata solo de binarios incluidos? Con la arquitectura configurada para excluir 64 bits, ¿el iPhone 5S ejecutará binario de 32 bits?
Crazy Yoghurt
acerca de la edición: Creo que el objetivo de implementación mínimo debe ser iOS 6.0, no iOS 7.0. @CrazyYoghurt Sí, al igual que con Mac: las máquinas de 64 bits pueden ejecutar binarios de 32 bits; de lo contrario, una máquina de 64 bits no tendría nada que ejecutar cuando se introdujera por primera vez.
trojanfoe
actualmente para trabajar la aplicación en 5s y otros dispositivos con el objetivo de implementación de iOS7 debe ser iOS 7.0
Anil Varghese
3
@CrazyYoghurt Entonces debes dejarte arm64.
trojanfoe
9

Mi comprensión de Apple Docs.

  • ¿Qué son las arquitecturas (ARCHS) en la configuración de compilación de Xcode?
    • Especifica la arquitectura o arquitectura a las que se dirige el binario . Cuando se especifica más de una arquitectura, el binario generado puede contener código objeto para cada una de las arquitecturas especificadas.
  • ¿Qué son las arquitecturas válidas (VALID_ARCHS) en la configuración de compilación de Xcode?

    • Especifica las arquitecturas para las que se puede CONSTRUIR el binario .
    • Durante el proceso de construcción, esta lista se cruza con ARCHS y la lista resultante especifica las arquitecturas en las que se puede ejecutar el binario.
  • Ejemplo: - Un proyecto de iOS tiene las siguientes configuraciones de compilación en Xcode.

    • ARCOS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • En este caso, se creará binario para arquitecturas armv7 armv7s arm64. Pero el mismo binario se ejecutará SÓLO en ARCHS = armv7 armv7s.
sw_engineer
fuente
9
No, todavía me confunde muchísimo: S
Ade
¿Qué es la "lista resultante"?
DanMoore
@DanMoore El resultado de la intersección establecida .
Slipp D. Thompson
2
Tendría sentido si pudiera encontrar una razón por la que construiría para una arquitectura en la que no quiero ejecutar.
rob5408
6

Cuando establece 64 bits, el binario resultante es un binario "Fat", que contiene las tres imágenes Mach-O empaquetadas con un encabezado delgado y delgado. Puedes ver eso usando otool o jtool. Puede consultar algunos binarios gordos incluidos como parte del SDK de iOS 7.0, por ejemplo, AVFoundation Framework, así:

% cd  /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/

%otool -V -f AVFoundation                                                                     9:36
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture arm64     # The 64-bit version (A7)
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 16384
    size 2329888
    align 2^14 (16384)
architecture armv7        # A5X - packaged after the arm64version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 2359296
    size 2046336
    align 2^14 (16384)
architecture armv7s       # A6 - packaged after the armv7 version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7S
    capabilities 0x0
    offset 4407296
    size 2046176
    align 2^14 (16384)

En cuanto al binario en sí, utiliza el conjunto de instrucciones ARM de 64 bits, que es (en su mayoría compatible con 32 bits, pero) un conjunto de instrucciones totalmente diferente. Esto es especialmente importante para el programa de gráficos (usando instrucciones y registros NEON). Asimismo, la CPU tiene más registros, lo que tiene un gran impacto en la velocidad del programa. Hay una discusión interesante en http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons sobre si esto hace una diferencia o no; Hasta ahora, las pruebas comparativas han indicado claramente que sí.

El uso de otool -tV volcará el ensamblaje (si tiene XCode 5 y posterior), y luego podrá ver las diferencias del conjunto de instrucciones por sí mismo. La mayoría (pero no todos) los desarrolladores permanecerán ajenos a los cambios, ya que en su mayor parte no afectan directamente a Obj-C (a pesar de las API CG *), y tienen que hacer más con el manejo de punteros de bajo nivel. El compilador hará su magia y optimizaciones.

Technologeeks
fuente
6

No es necesario que limite su compilador solo a armv7 y armv7s eliminando la configuración de arm64 de las arquitecturas compatibles. Solo necesita establecer la configuración del objetivo de implementación en 5.1.1

Nota importante: no puede establecer el objetivo de implementación en 5.1.1 en la sección Configuración de compilación porque es un menú desplegable con valores fijos. Pero puede configurarlo fácilmente en 5.1.1 en la sección General de la configuración de la aplicación simplemente escribiendo el valor en el campo de texto.

Kibernetik
fuente
5

Arreglo simple:

Objetivos -> Configuración de compilación -> Opciones de compilación -> Habilitar código de bits -> No

Funciona en dispositivos con iOS 9.3.3

Maselko
fuente
4

Ninguna de las respuestas funcionó y luego me olvidé de establecer el objetivo de implementación mínimo que se puede encontrar en Proyecto -> General -> Información de implementación -> Objetivo de implementación -> 8.0

Ejemplo

tsuz
fuente