web-dev-qa-db-fra.com

Xcode 5 et iOS 7: Architecture et architectures valides

Je commence un nouveau projet dans Xcode 5. Je souhaite développer une application en utilisant iOS SDK 7 mais avec la cible de déploiement iOS 5.0. Dès que je crée un nouveau projet dans Xcode et que je tente de changer la cible de déploiement en 5.0, j'ai le message suivant:

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.

Ainsi, les architectures changèrent en Standard (pas de 64 bits). Je compile, je cours mais je ne comprends pas vraiment ce qui vient de se passer.

Quelle est la différence entre les paramètres Architectures et Valid architectures dans les paramètres de construction du projet Xcode?
Si je règle Architectures pour exclure le 64 bits, que se passe-t-il lorsque je lance mon application sur un iPhone 64 bits ou un simulateur iOS (je sais que cela fonctionne, je suis curieux de savoir ce qui se passe dessous)?
Pouvez-vous expliquer le grand désordre avec la nouvelle architecture 64 bits?

enter image description here

81
Crazy Yoghurt

Définissez le paramètre d'architecture dans la construction sur Architectures standard (armv7, armv7s)

enter image description here

l'iPhone 5S est alimenté par le processeur A7 64 bits. De documentation Apple

Xcode peut créer votre application avec les fichiers binaires 32 bits et 64 bits inclus. Ce binaire combiné nécessite une cible de déploiement minimale d'iOS 7 ou ultérieure.

Remarque: une future version de Xcode vous permettra de créer une seule application prenant en charge le runtime 32 bits sur iOS 6 et versions ultérieures et prenant en charge le runtime 64 bits sur iOS 7.

D'après la documentation, ce que j'ai compris est

  • Xcode peut créer les deux fichiers binaires 64 bits 32 bits pour une seule application, mais la cible de déploiement doit être iOS7. Ils disent qu'à l'avenir ce sera iOS 6.0
  • Le binaire 32 bits fonctionnera correctement sur l'iPhone 5S (processeur 64 bits).

Mise à jour (Xcode 5.0.1)
Dans Xcode 5.0.1, ils ont ajouté le support pour créer du binaire 64 bits pour iOS 5.1.1 et les versions ultérieures.

Xcode 5.0.1 peut créer votre application avec les fichiers binaires 32 bits et 64 bits inclus. Ce binaire combiné nécessite une cible de déploiement minimale pour iOS 5.1.1 ou version ultérieure. Le binaire 64 bits ne s'exécute que sur les périphériques 64 bits exécutant iOS 7.0.3 et versions ultérieures.

Mise à jour (Xcode 5.1)
Xcode 5.1 a apporté des modifications significatives dans la section architecture. Ceci réponse sera un suivi pour vous. Cochez cette case

122
Anil Varghese

Lorsque vous définissez 64 bits, le binaire résultant est un binaire "Fat", qui contient les trois images Mach-O associées à un en-tête Fat Fat. Vous pouvez voir cela en utilisant otool ou jtool. Vous pouvez consulter certains fichiers binaires gras inclus dans le SDK iOS 7.0, par exemple, le cadre AVFoundation, comme suit:

% 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)

Quant au binaire lui-même, il utilise le jeu d’instructions de bits ARM64, qui est (principalement compatible avec 32 bits, mais) un jeu d’instructions totalement différent. Ceci est particulièrement important pour les programmes graphiques (utilisant les instructions et les registres NEON). De même, la CPU a plus de registres, ce qui a un impact important sur la vitesse du programme. Il y a une discussion intéressante dans http://blogs.barrons.com/techtraderdaily/2013/09/19/Apple-the-64-bit-question/?mod=yahoobarrons sur le point de savoir si cela rend ou non une différence; les tests d’étalonnage ont jusqu’ici clairement indiqué que c’était le cas.

Si vous utilisez otool -tV, l’assemblage sera sauvegardé (si vous avez XCode 5 et versions ultérieures), puis vous pourrez voir les différences de jeu d’instructions pour vous-même. La plupart des développeurs (mais pas tous) resteront agnostiques vis-à-vis des modifications, dans la mesure où ils n'affectent pas directement Obj-C (à l'exception des API CG *) et doivent en faire plus avec la gestion des pointeurs de bas niveau. Le compilateur travaillera sa magie et ses optimisations.

7
Technologeeks

Ma compréhension de Apple Docs.

  • Qu'est-ce que Architectures (ARCHS) dans les paramètres de construction de Xcode?
    • Spécifie la/les architecture (s) à laquelle (s) le binaire est TARGET. Lorsque plusieurs architectures sont spécifiées, le binaire généré peut contenir un code objet pour chacune des architectures spécifiées.
  • Qu'est-ce que Architectures valides (VALID_ARCHS) dans les paramètres de construction de Xcode?

    • Spécifie l'architecture/les architectures pour lesquelles le fichier binaire peut être CONSTRUIT.
    • Pendant le processus de construction, cette liste est intersectée avec ARCHS et la liste résultante spécifie les architectures sur lesquelles le fichier binaire peut être exécuté.
  • Exemple: - Un projet iOS possède les paramètres de construction suivants dans Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • Dans ce cas, le binaire sera construit pour les architectures armv7 armv7s arm64. Mais le même fichier binaire sera exécuté sur ONLY ARCHS = armv7 armv7s.
7
engineer

Vous n'avez pas besoin de limiter votre compilateur à seulement armv7 et armv7s en supprimant le paramètre arm64 des architectures prises en charge. Il vous suffit de définir cible de déploiement sur 5.1.1

Remarque importante: vous ne pouvez pas définir la cible de déploiement sur 5.1.1 dans la section Paramètres de construction car cette liste déroulante contient uniquement des valeurs fixes. Mais vous pouvez facilement le définir à 5.1.1 dans la section Général des paramètres de l'application en saisissant simplement la valeur dans un champ de texte.

6
Kibernetik

Solution simple:

Cibles -> Paramètres de construction -> Options de construction -> Activer le code binaire -> Non

Fonctionne sur le périphérique avec iOS 9.3.3

5
Maselko

Aucune des réponses ne fonctionnait et ensuite j'oubliais de définir une cible de déploiement minimale qui peut être trouvée dans Projet -> Général -> Informations de déploiement -> Cible de déploiement -> 8.0

Example

4
tsuz