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

пример

Другие вопросы по тегам