Xcode 5 и iOS 7: архитектура и допустимые архитектуры

Я запускаю новый проект в Xcode 5. Я хочу разработать приложение с помощью iOS SDK 7, но с целью развертывания iOS 5.0. Как только я создаю новый проект в Xcode и попытаюсь изменить цель развертывания на 5.0, у меня есть это сообщение:

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.

Так изменились архитектуры до Standard (без 64 ​​бит). Я компилирую, работает, но я действительно не понимаю, что только произошло.

Какая разница между настройками Architectures и Valid architectures в проекте Xcode Build Settings?
Если я установил Architectures, чтобы исключить 64 -битное, что происходит, когда я запускаю свое приложение на 64-битном iPhone или iOS Simulator (я знаю, что это работает, мне просто интересно, что hapens underneath)?
Можете ли вы объяснить большой беспорядок с новой 64-битной архитектурой?

enter image description here

Ответ 1

Установите для архитектуры в настройке сборки значение Стандартные архитектуры (armv7, armv7s)

enter image description here

iPhone 5S оснащен процессором A7 64 бит. Из apple docs

Xcode может создавать ваше приложение с включенными 32-битными и 64-битными двоичными файлами. Этот комбинированный двоичный файл требует минимальной цели развертывания iOS 7 или новее.

Примечание. Будущая версия Xcode позволит вам создать одно приложение, поддерживающее 32-разрядную среду выполнения на iOS 6 и более поздних версиях, и поддерживающее 64-битную среду выполнения на iOS 7.

Из документации я понял

  • Xcode может создавать как 64-битные 32-битные двоичные файлы для одного приложения, Цель развертывания должна быть iOS7. Они говорят, что в будущем iOS 6.0
  • 32-битная бинарная система отлично работает в iPhone 5S (64-битный процессор).

Обновление (Xcode 5.0.1)
В Xcode 5.0.1 они добавили поддержку для создания 64-битного двоичного файла для iOS 5.1.1 и далее.

Xcode 5.0.1 может создавать ваше приложение с включенными 32-битными и 64-битными двоичными файлами. Этот комбинированный двоичный файл требует минимальной цели развертывания iOS 5.1.1 или новее. 64-разрядная двоичная версия работает только на 64-разрядных устройствах под управлением iOS 7.0.3 и более поздних версий.

Обновление (Xcode 5.1)
Xcode 5.1 внес существенные изменения в раздел архитектуры. Этот ответ станет для вас продолжением. Проверьте это

Ответ 2

Когда вы устанавливаете 64-битный результирующий двоичный файл, это двоичный файл "Fat", который содержит все три изображения Mach-O в комплекте с тонким жирным заголовком. Вы можете видеть это с помощью otool или jtool. Вы можете проверить некоторые живые двоичные файлы, включенные как часть IOS 7.0 SDK, например, AVFoundation Framework, например:

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

Что касается самого двоичного файла, он использует набор команд бит ARM64, который (в основном совместим с 32-битным, но) совершенно другим набором команд. Это особенно важно для графической программы (с использованием инструкций и регистров NEON). Аналогично, у процессора больше регистров, что существенно влияет на скорость программы. Там интересная дискуссия в http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons о том, действительно ли это имеет значение; тесты на бенчмаркинг до сих пор четко указывали, что это происходит.

Использование otool -tV приведет к сбою сборки (если у вас есть XCode 5 и более поздние версии), а затем вы можете увидеть различия в наборе инструкций для себя. Большинство (но не все) разработчиков останутся без изменений для изменений, так как по большей части они не влияют напрямую на API Obj-C (CG * API) и должны делать больше с обработкой указателей низкого уровня. Компилятор будет работать с магией и оптимизацией.

Ответ 3

Мое понимание от Apple Docs.

  • Что такое Архитектура (ARCHS) в настройках сборки Xcode?
    • Указывает архитектуру /s, для которой двоичный файл ЦЕЛЬ > . Если указано больше одной архитектуры, сгенерированный двоичный файл может содержать объектный код для каждой из указанной архитектуры.
  • Что такое Действительные архитектуры (VALID_ARCHS) в настройках сборки Xcode?

    • Указывает архитектуру /s, для которой двоичный файл может быть ВСТРОЕН.
    • В процессе сборки этот список пересекается с ARCHS, и полученный в результате список указывает архитектуры, на которые может работать двоичный файл.
  • Пример: - Один проект iOS имеет следующие настройки сборки в Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • В этом случае двоичный файл будет создан для armv7 armv7s arm64. Но один и тот же двоичный файл будет работать на ONLY ARCHS = armv7 armv7s.

Ответ 4

Вам не нужно ограничивать свой компилятор только armv7 и armv7s, удалив параметр arm64 из поддерживаемых архитектур. Вам просто нужно установить для параметра Цель развертывания значение 5.1.1

Важное примечание: вы не можете установить цель развертывания в 5.1.1 в разделе Настройки сборки, поскольку она выпадает только с фиксированными значениями. Но вы можете легко установить его в 5.1.1 в разделе Общие параметров приложения, просто набрав значение в текстовом поле.

Ответ 5

Простое исправление:

Цели → Настройки сборки → Параметры сборки → Включить биткод → Нет

Работает на устройстве с iOS 9.3.3

Ответ 6

Ни один из ответов не работал, а затем я забыл установить минимальную цель развертывания, которую можно найти в Проект Общие Информация о развертывании Цель развертывания → 8.0

Пример