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

82

Я начинаю новый проект в 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-битной архитектурой?

введите описание изображения здесь

Сумасшедший йогурт
источник
Вы смотрели форумы разработчиков Apple? Об этом написано много. devforums.apple.com/message/887506#887506
trojanfoe

Ответы:

123

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

введите описание изображения здесь

iPhone 5S оснащен 64-битным процессором A7. Из документов Apple

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 внес существенные изменения в раздел архитектуры. Этот ответ станет для вас продолжением. Проверь это

Анил Варгезе
источник
Как я уже писал в своем вопросе, я это уже сделал. Мой вопрос больше о том, что это меняется и что происходит под ним.
Crazy Yoghurt
насчет редактирования: Значит, речь идет только о включенных двоичных файлах? Если для архитектуры задано исключение 64-разрядной версии, iPhone 5S будет работать с 32-разрядным двоичным кодом?
Crazy Yoghurt
о редактировании: я думаю, что минимальная цель развертывания должна быть iOS 6.0, а не iOS 7.0. @CrazyYoghurt Да, как и в случае с Mac - 64-битные машины могут запускать 32-битные двоичные файлы, иначе на 64-битной машине нечего было бы запускать при первом запуске.
trojanfoe
в настоящее время для работы приложения на 5s и других устройствах с iOS7 целью развертывания должна быть iOS 7.0
Анил Варгезе
3
@CrazyYoghurt Тогда ты должен бросить arm64.
trojanfoe
9

Насколько я понимаю, из Apple Docs.

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

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

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • В этом случае двоичный файл будет собран для архитектур armv7 armv7s arm64. Но тот же двоичный файл будет работать ТОЛЬКО на ARCHS = armv7 armv7s.
sw_engineer
источник
9
Нет, до сих пор меня чертовски смущает: S
Ade
что такое "результирующий список" ??
DanMoore
@DanMoore Результат заданного пересечения .
Слипп Д. Томпсон
2
Было бы разумно, если бы я мог найти причину, по которой я построю архитектуру, на которой я не хочу работать.
rob5408
6

Когда вы устанавливаете 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 (несмотря на CG * API) и должны делать больше с обработкой указателей низкого уровня. Компилятор будет творить чудеса и оптимизацию.

Технологеекс
источник
6

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

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

Кибернетик
источник
5

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

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

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

Маселко
источник
4

Ни один из ответов не сработал, а затем я забыл установить минимальную цель развертывания, которую можно найти в Project -> General -> Deployment Info -> Deployment Target -> 8.0

пример

цуз
источник