В чем разница между «Архитектурами» и «Действительными архитектурами» в настройках сборки Xcode?

113

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

Northtree
источник

Ответы:

113

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

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

Или в Apple-ese:

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

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

и:

VALID_ARCHS (допустимые архитектуры)

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

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

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

Джереми В. Шерман
источник
1
@DanMoore "Результирующий список архитектуры" создается в памяти во время сборки.
Saltymule
3
@ onmyway133 В большинстве случаев вам не нужны VALID_ARCHS. Если вы писали встроенный asm только для определенных архитектур, вы можете изменить VALID_ARCHS, чтобы отразить, что ваш код больше не предназначен для каких-либо архитектур, кроме этих. В основном, однако, это просто сигнал от Xcode, который указывает, для каких архитектур он может быть построен, и вы выбираете оттуда для своей ARCHS.
Jeremy W. Sherman
4

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

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

Так что, возможно, вы хотите создать свой двоичный файл только для armv7s, но тот же исходный код будет
хорошо компилироваться для 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, поскольку процессор arm имеет обратную совместимость .

глупый
источник
1
Он был прав: «потому что это все, что вы действительно хотите построить с помощью своего кода».
Laszlo