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 Настройки сборки?
Если я установлю Architectures
чтобы исключить 64-битное, что происходит, когда я запускаю свое приложение на 64-битном iPhone или iOS Simulator (я знаю, что это работает, мне просто интересно, что происходит под ним)?
Можете ли вы объяснить большой беспорядок с новой 64-битной архитектурой?
6 ответов
Установите архитектуру в настройках сборки на Стандартные архитектуры (armv7, armv7s)
iPhone 5S оснащен 64-битным процессором A7. Из яблочных документов
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 внес значительные изменения в раздел архитектуры. Этот ответ будет продолжением для вас. Проверь это
Мое понимание от Apple Docs.
- Что такое архитектура (ARCHS) в настройках сборки XCode?
- Определяет архитектуру (и), для которой предназначен двоичный файл. Когда указано более одной архитектуры, сгенерированный двоичный файл может содержать объектный код для каждой из указанных архитектур.
Что такое допустимые архитектуры (VALID_ARCHS) в настройках сборки Xcode?
- Определяет архитектуру / ы, для которых двоичный файл может быть ВСТРОЕН.
- В процессе сборки этот список пересекается с ARCHS, и результирующий список определяет архитектуры, на которых может работать двоичный файл.
Пример:- Один проект iOS имеет следующие настройки сборки в XCode.
- ARCHS = armv7 armv7s
- VALID_ARCHS = armv7 armv7s arm64
- В этом случае двоичный файл будет создан для архитектур armv7 armv7s arm64. Но тот же двоичный файл будет работать только на ARCHS = armv7 armv7s.
Когда вы устанавливаете 64-битную версию, получающийся двоичный файл является "толстым" двоичным файлом, который содержит все три изображения 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 и более поздние версии), а затем вы сможете увидеть различия набора команд для себя. Большинство (но не все) разработчики будут оставаться независимыми от изменений, поскольку по большей части они напрямую не влияют на Obj-C (несмотря на API CG *) и должны делать больше с обработкой указателей низкого уровня. Компилятор поработает со своей магией и оптимизацией.
Вам не нужно ограничивать ваш компилятор только armv7 и armv7s, удаляя настройку arm64 из поддерживаемых архитектур. Вам просто нужно установить целевое значение для развертывания 5.1.1.
Важное примечание: вы не можете установить целевое значение "Развертывание" 5.1.1 в разделе " Параметры сборки ", так как оно выпадающее только с фиксированными значениями Но вы можете легко установить его на 5.1.1 в разделе " Общие " настроек приложения, просто набрав значение в текстовом поле.
Простое исправление:
Цели -> Настройки сборки -> Параметры сборки -> Включить битовый код -> Нет
Работает на устройстве с iOS 9.3.3
Ни один из ответов не сработал, и тогда я забыл установить минимальную цель развертывания, которую можно найти в Project -> General -> Deployment Info -> Deployment Target -> 8.0