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.
Ответ 4
Вам не нужно ограничивать свой компилятор только armv7 и armv7s, удалив параметр arm64 из поддерживаемых архитектур.
Вам просто нужно установить для параметра Цель развертывания значение 5.1.1
Важное примечание: вы не можете установить цель развертывания в 5.1.1 в разделе Настройки сборки, поскольку она выпадает только с фиксированными значениями. Но вы можете легко установить его в 5.1.1 в разделе Общие параметров приложения, просто набрав значение в текстовом поле.
Ответ 5
Простое исправление:
Цели → Настройки сборки → Параметры сборки → Включить биткод → Нет
Работает на устройстве с iOS 9.3.3
Ответ 6
Ни один из ответов не работал, а затем я забыл установить минимальную цель развертывания, которую можно найти в Проект → Общие → Информация о развертывании → Цель развертывания → 8.0
![Пример]()