Какая разница между "Архитектурами" и "Действительными архитектурами" в настройках сборки Xcode?

В чем смысл их и могу ли я установить их в разных значениях?

Ответ 1

Архитектуры - это те, которые вы хотите построить, действительные архитектуры - это те, которые вы можете создать с помощью своей базы кода.

Так что, возможно, вы хотите создать свой бинарный файл только для armv7s, но один и тот же исходный код прекрасно скомпилируется для armv7 и armv6. Итак, VALID_ARCHS = armv6 armv7 armv7s, но вы устанавливаете ARCHS = armv7s потому что это все, что вы действительно хотите построить с помощью своего кода.

Или в Apple-ese:

ARCHS (Архитектура)

Разделенный пробелами список идентификаторов. Определяет архитектуры (ABI, модели процессоров), для которых предназначен двоичный файл. Когда этот параметр сборки определяет более одной архитектуры, сгенерированный двоичный файл может содержать объектный код для каждой из указанных архитектур.

а также:

VALID_ARCHS (действительные архитектуры)

Разделенный пробелами список идентификаторов. Определяет архитектуры, для которых может быть построен двоичный файл. Во время сборки этот список пересекается со значением параметра сборки ARCHS; результирующий список определяет архитектуры, на которых может работать двоичный файл. Если результирующий список архитектуры пуст, цель не генерирует двоичный файл.

Источник: Справочник по настройке сборки XCode

На практике вы оставляете VALID_ARCHS покое и не беспокоитесь об изменении его, а просто ARCHS с ARCHS чтобы установить архитектуры, которые вы хотите построить. Как правило, вы устанавливаете сборку Debug только на NATIVE_ARCH, так как вы хотите создать только отладочную версию для машины, на которой вы будете ее тестировать/запускать, а выпуски Release собирают для всего спектра архитектур, которые вы планируете поддерживать.

Ответ 2

Из документа Apple мы знаем, что бинарный Xcode будет создавать список Valid Architectures, пересеченный с Architectures.

Итак, я не думаю, что ответ Джереми прав, поскольку он говорит:

Так что, возможно, вы только хотите создать свой двоичный файл для armv7, но тот же исходный код будет     компилировать штраф для armv7 и armv6. Итак VALID_ARCHS = armv6 armv7 armv7s, но вы установили     ARCHS = armv7s, потому что все, что вы на самом деле хотите создать с помощью своего кода.

Когда вы устанавливаете VALID_ARCHS = armv6 armv7 armv7s и устанавливаете ARCHS = armv7s, результат двоичного Xcode будет составлять armv7s, он не может быть совместим с armv6/armv7.

И если вы хотите совместиться с armv6/armv7/armv7s, вы должны установить VALID_ARCHS = armv6 armv7 armv7s и ARCHS = armv6. Таким образом, результат двоичного Xcode будет составлять armv6, и он может нормально работать как на armv6/armv7/armv7s как процессор для рук обратно совместим.