Quelle est la différence entre «Architectures» et «Architectures valides» dans les paramètres de construction Xcode?

112

Quelle est leur signification et puis-je les définir dans des valeurs différentes?

Northtree
la source

Réponses:

113

Les architectures sont celles que vous souhaitez construire, les architectures valides sont celles que vous pourriez concevoir de construire avec votre base de code.

Alors peut-être que vous ne voulez construire votre binaire que pour armv7s, mais le même code source compilerait bien pour armv7 et armv6. Donc VALID_ARCHS = armv6 armv7 armv7s, mais vous définissez ARCHS = armv7sparce que c'est tout ce que vous voulez réellement construire avec votre code.

Ou, en Apple-ese:

ARCHES (Architectures)

Liste d'identificateurs séparés par des espaces. Spécifie les architectures (ABI, modèles de processeur) vers lesquelles le binaire est ciblé. Lorsque ce paramètre de construction spécifie plus d'une architecture, le binaire généré peut contenir du code objet pour chacune des architectures spécifiées.

et:

VALID_ARCHS (architectures valides)

Liste d'identificateurs séparés par des espaces. Spécifie les architectures pour lesquelles le binaire peut être construit. Pendant la construction, cette liste est intersectée avec la valeur du paramètre de construction ARCHS; la liste résultante spécifie les architectures sur lesquelles le binaire peut fonctionner. Si la liste d'architecture résultante est vide, la cible ne génère aucun binaire.

Source: Référence des paramètres de construction Xcode

En pratique, vous partez VALID_ARCHSseul et ne vous souciez pas de le changer, et vous vous contentez de jouer avec ARCHSpour définir les architectures que vous souhaitez construire. En règle générale, vous définissez une version de débogage sur juste NATIVE_ARCH, puisque vous souhaitez uniquement créer la version de débogage pour la machine sur laquelle vous allez la tester / l'exécuter, et publier des versions pour l'ensemble des architectures que vous prévoyez de prendre en charge.

Jeremy W. Sherman
la source
1
@DanMoore La "liste d'architecture résultante" est faite en mémoire au moment de la construction.
Saltymule
3
@ onmyway133 La plupart du temps, vous ne voulez pas de VALID_ARCHS. Si vous écriviez asm en ligne uniquement pour certaines architectures, vous pouvez modifier VALID_ARCHS pour indiquer que votre code n'est plus destiné à aucune autre que ces architectures. La plupart du temps, cependant, ce n'est qu'un signal de Xcode qui vous indique les architectures pour lesquelles il peut construire, et vous choisissez à partir de là pour votre ARCHS.
Jeremy
4

D'après le document Apple, nous savons que le binaire Xcode va construire est la liste Valid Architectures intersectée avec Architectures.

Donc, je ne pense pas que la réponse de Jeremy soit juste, comme il le dit:

Alors peut-être que vous ne voulez construire votre binaire que pour armv7s, mais le même code source
compilerait bien pour armv7 et armv6. Donc VALID_ARCHS = armv6 armv7 armv7s, mais vous définissez ARCHS = armv7s parce que c'est tout ce que vous voulez réellement construire avec votre code.

Lorsque vous définissez VALID_ARCHS = armv6 armv7 armv7set définissez ARCHS = armv7s, le résultat de la construction binaire de Xcode est armv7s , il n'est pas compatible avec armv6 / armv7.

Et si vous voulez être compatible avec armv6 / armv7 / armv7s, vous devez définir VALID_ARCHS = armv6 armv7 armv7set ARCHS = armv6.De cette façon, le résultat de Xcode binaire sera construit est armv6, et il peut fonctionner correctement sur les deux armv6 / armv7 / armv7s car le processeur arm est rétrocompatible .

foutre
la source
1
Il avait raison: "parce que c'est tout ce que vous voulez réellement construire avec votre code".
Laszlo