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 Build Settings?
Якщо я вирішу Architecturesвиключити 64-розрядну версію, що відбувається, коли я запускаю свою програму на 64-розрядному iPhone або iOS Simulator (я знаю, що це працює, мені просто цікаво, що відбувається внизу)?
Чи можете ви пояснити великий хаос новою 64-розрядною архітектурою?

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


Ви заглядали на форуми розробників Apple? Про це є багато публікацій. devforums.apple.com/message/887506#887506
trojanfoe

Відповіді:


123

Встановіть архітектуру в налаштуваннях збірки на Стандартні архітектури (armv7, armv7s)

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

iPhone 5S працює на 64-бітному процесорі A7. З 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 вніс суттєві зміни в розділі архітектури. Ця відповідь стане для вас продовженням. Перевір це


Як я вже писав у своєму питанні, я це вже зробив. Моє питання полягає більше в тому, що це змінює, і що відбувається під ним.
Божевільний йогурт

про редагування: Отже, йдеться лише про включені двійкові файли? Якщо архітектура налаштована на виключення 64-розрядної версії, iPhone 5S буде працювати з 32-розрядною двійковою системою?
Божевільний йогурт

про редагування: Я думаю, що мінімальною метою розгортання має бути iOS 6.0, а не iOS 7.0. @CrazyYoghurt Так, як і у Mac - 64-розрядні машини можуть запускати 32-розрядні бінарні файли, інакше 64-розрядна машина не мала б чого запускати при першому введенні.
trojanfoe

в даний час для роботи програми на 5s та інших пристроях з метою розгортання iOS7 має бути iOS 7.0
Anil Varghese

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.

9
Ні, все ще бентежить мене: S
Аде

що таке "підсумковий список" ??
DanMoore


2
Це мало б сенс, якби я міг знайти причину, чому будувати архітектуру, на якій я не хочу працювати.
rob5408

6

Коли ви встановлюєте 64-біт, отриманий двійковий файл є двійковим файлом "Жир", який містить усі три зображення Mach-O в комплекті з тонким заголовком жиру. Ви можете переконатися, що за допомогою otool або jtool. Ви можете перевірити деякі бінарні файли жиру, що входять до складу SDK для iOS 7.0, наприклад 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 *), і їм доводиться робити більше за допомогою низькорівневої обробки вказівників. Компілятор буде працювати над своєю магією та оптимізацією.


6

Вам не потрібно обмежувати ваш компілятор лише armv7 та armv7s , видаляючи параметр arm64 із підтримуваних архітектур. Вам просто потрібно встановити цільове налаштування розгортання на 5.1.1

Важливе зауваження: ви не можете встановити для цілі розгортання значення 5.1.1 у розділі Налаштування збірки, оскільки вона випадає лише з фіксованими значеннями. Але ви можете легко встановити його на 5.1.1 у розділі Загальні налаштувань програми, просто ввівши значення в текстове поле.


5

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

Цілі -> Налаштування збірки -> Параметри збірки -> Увімкнути біт-код -> Ні

Працює на пристрої з iOS 9.3.3


4

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

Приклад

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.