Xcode 5.1 - архітектури для компіляції немає (ONLY_ACTIVE_ARCH = ТАК, активна арка = x86_64, VALID_ARCHS = i386)


168

Після оновлення до Xcode 5.1 я більше не можу будувати свій проект для 64-бітового симулятора, отримуючи цю помилку:

 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).

Це мої налаштування цільової збірки:

Налаштування збірки цілі Xcode

Я спробував змінити "Зробити активну архітектуру" на Ні, а також додати "i386" до "Дійсні архітектури", на жаль, не працював. Дякуємо за будь-які пропозиції!


4
Я бачив досить багато подібних питань після останнього оновлення iOS 7.1, і рішенням було залишити руку64. Щоправда, це не вирішує вашу конкретну проблему, але є підстави вважати, що Apple щось зіпсувала.
dandan78

Дякую, це має сенс, я думаю, я не буду використовувати 64-розрядні, поки Apple не випустить оновлення для цього.
ebi


Те саме питання на Xcode 6.1, спробували всі рішення, наведені нижче, вони не працюють. У моєму проекті є CocoaPods. Будь-яке рішення про те, як виправити це на Xcode 6.1
Vinayaka Karjigi

Відповіді:


102

У мене було те саме повідомлення про помилку після оновлення до XCode 5.1. Ви використовуєте CocoaPods? Якщо так, це має вирішити проблему:

  1. Видаліть проект "Pods" з робочої області на лівій панелі Xcode та закрийте Xcode.
  2. Запустіть "pod install" з командного рядка, щоб відтворити проект "Pods".
  3. Відкрийте Xcode і переконайтесь, що в налаштуваннях збірки як проекту "Pods", так і для вашого власного проекту встановлено значення "No" лише для активної архітектури ".
  4. Очистіть і побудуйте.

1
Виправлено шляхом видалення arm64 з архітектури Pods.
ebi

Таку ж проблему вирішив і в проекті Cordova / PhoneGap. Спасибі
Rocco

182

Що вам потрібно зробити , це просто встановити , ONLY_ACTIVE_ARCHщоб NO(принаймні у мене працює). Нижче наведено скріншот для цього:


Редагувати:

Наскільки я знаю ( будь ласка , вкажіть це, якщо є що - то не так, спасибі ), якщо ви встановите ONLY_ACTIVE_ARCHна YES, це означає , що Xcode буде будувати тільки для активної архітектури (яка відноситься до пристрою , яке входить в Xcode в даний час). Здається, для налаштування Xcode за замовчуванням встановлено значення НалагодженняYES , тому він не буде створювати бінарні файли для інших архітектур, коли ви хочете створити лише спеціальний пристрій, підключений до вашого Mac.

Причина невдалої побудови може полягати в тому, що проект не підтримує архітектуру підключеного пристрою. Тож найкращим рішенням є додати правильну архітектуру для свого пристрою. Нижче наведено список архітектур та пристроїв, які підтримують:

  • ARMv8 / ARM64: iPhone 6, iPhone 5s, iPad Air,Retina iPad Mini
  • ARMv7s: iPhone 5,iPhone 5c ,iPad 4
  • ARMv7: iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3,iPad Mini
  • ARMv6: iPhone, iPhone 3G,iPod 1G/2G

Так чому «встановити ONLY_ACTIVE_ARCHв NO» працює? Оскільки пристрій все ще може працювати з двійковим файлом, створеним для всіх доданих архітектур (пройти збірку), але втратить певну продуктивність. Це просто швидке рішення, але не найкраще.


Примітка . Чим більше архітектур ви додали, тим більше буде сформовано двійковий файл. Тож добре вибрати правильні архітектури для свого проекту. ;)


@EmilMarashliev лише ціль збірки. Ви побачите це, коли ви виберете свій кореневий проект (із синім значком).
Kjuly

@Praveen не впевнений, здається, що цей параметр змінити в Xcode 5.1.
Кюли

Це правильна відповідь, ви врятували мені тут життя, дякую :)
Bikramjit Singh

2
Це найяскравіша і найповніша відповідь. Обов’язково повинен бути затвердженим !!! Дякую
MeV

1
це було дуже корисно. відповідь буде повною, якщо ви можете додати, як завантажити потрібну архітектуру.
Калпеш Попат

29

Додати arm64до цільових valid architectures. Схоже, це додає x86-64архітектуру і в симулятори дійсних архітектур.


27

Якщо ви використовуєте CocoaPods, найімовірніша проблема полягає в тому, що для вашого Pods Project Build Settings (Налаштування збірки проекту лише для Active Active Architecture ) встановлено значення Так для налагодження.

Рішення просте. Змініть його на Ні .

Аналогічно змініть на " Ні" для свого проектного проекту.


12

У мене було подібне питання. Вирішили це, змінивши "Архітектура" на " $ (ARCHS_STANDARD_32_BIT) " у Налаштуваннях збірки для проекту.

Тепер вам потрібно вибрати Стандартні архітектури (armv7, arm64) - $ (ARCHS_STANDARD), оскільки Apple рекомендує додатки будуватись на 64-бітній архітектурі. Клацніть: Apple документ


@JayprakashDubey, що з цим? $(ARCHS_STANDARD_INCLUDING_64_BIT)?
Хеман

Чи варто використовувати $(ARCHS_STANDARD_32_BIT)або $(ARCHS_STANDARD_INCLUDING_64_BIT)?
Хеман

@hagile: Ідіть з $ (ARCHS_STANDARD_INCLUDING_64_BIT)
Jayprakash Dubey

10

Додати: Архітектура: $ (ARCHS_STANDARD_INCLUDING_64_BIT)

Дійсні архітектури: arm64 armv7 armv7s


Хм, ти намагався скинути все, вміст тренажера, симулятор, чистий проект, перезапустити xCode та Mac, тому що у мене є xCode5.1, і мій тренажер працює добре
AntonijoDev

У вас працює додаток / тренажер, використовуючи 4-дюймовий 64-розрядний iPhone?
ebi

5

На всякий випадок, якщо хтось із проблемою все-таки стикається, не дивлячись на вищезазначене, перевірте, чи підтримуваний імітатор також підтримується. У мене був вказаний мін arm7 і arm7s, але намагався запустити додаток на 64-бітовому симуляторі.


+1 Так, це один! Після перевірки та повторної перевірки та потрійної перевірки, що все ще гаразд, це була проблема!
JOM

1
Ого. Мені потрібно фактично підключити пристрій, для якого я хочу створити, щоб скомпілювати належний цільовий код? Я просто тріснув у рот. Ваше повідомлення вирішило це питання для мене, дякую.

5

Щоб уникнути "встановлення pod" скидання only_active_arch для налагодження кожного разу, коли він запускається, ви можете додати в файл pod

# Append to your Podfile
post_install do |installer_representation|
    installer_representation.project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
        end
    end
end

3

Просто додайте arm64 у дійсну архітектуру. Я сподіваюся, що вона буде працювати для вас.


3

Моя проблема полягала в тому, що проект Pods орієнтувався на OS X, незважаючи на те, що я мав Podfile platform :ios. Я використовую cocoapods 0,35.0.rc2.

Щоб виправити це, виберіть проект Pods в навігаторі проектів та перевірте, чи вузол PROSECT PROSECT (пам'ятайте, а не ціль Pods) орієнтований на iOS. Тобто, архітектури побудови параметрів повинні бути:

  • Архітектура: $(ARCHS_STANDARD)
  • Базова SDK: iOS 8.1
  • Підтримувані платформи: iOS
  • Дійсні архітектури: $(ARCHS_STANDARD)

Я також хотів створити всі архітектури, тому я додав у Podfile таке:

post_install do | installer |
    installer.project.build_configurations.each do |config|
        config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
    end
end

3

Мені довелося додати наступне i386і x86_64до Valid Architectures. Я використовую Xcode 7.2 і націлюю на iOS 8+. У мене вже було armv7, armv7sа arm64там і той працював у Xcode 6.4.


2

Я зіткнувся з тією ж проблемою, коли запускав додаток на iPad за допомогою xcode 5.1. Її вирішили, видаливши armv7s з "дійсних архітектур" та встановивши значення "лише активні архітектури" на значення Ні. Обидва ці поля можна знайти у вашій програмі-> target-> налаштування збірки-> архітектури.


2

До цього питання я прийшов через проблему з побудовою командного рядка для симулятора в Xcode 7.2. Якщо хтось потрапить сюди з тим же питанням, я поділюся знайденим рішенням:

Мабуть, у Xcode 7.2 є помилка, яка спричиняє xcodebuildзбій при спробі побудови симулятора. Рішення полягає у визначенні опції "-destination", наприклад:

xcodebuild -project TestBuildCmd.xcodeproj -scheme TestBuildCmd -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' build

Оновлення

Наведена вище команда прикладу буде створювати двійковий файл, включаючи графіку лише для iPhone 6. Якщо двійковий файл працює на інших тренажерах, графіка iPhone 6 масштабується до платформи. Краще обхідний шлях , який містить всі графіки для всіх платформ , щоб вказати параметр PLATFORM_NAME=iphonesimulator, наприклад:

xcodebuild -project TestBuildCmd.xcodeproj -scheme TestBuildCmd -sdk iphonesimulator -arch i386 PLATFORM_NAME=iphonesimulator build

0

Спробуйте видалити всі попередні архітектури (тобто видаліть налаштування ARCHS_STANDARD) одночасно, коли ви додасте i386 до архітектури. Це має змінити активну архітектуру на i386. Я зіткнувся з подібною проблемою, коли я намагався створити для armv7 за замовчуванням, але він намагався створити для arm64. Я змінив ARCHS_STANDARD на ARCHS_STANDARD_32_BIT, і це змінило вибрану активну архітектуру.


0

В архітектурі - іноді для підтримки 6.0 і 7.0 ми виключаємо arm64

В архітектурах -> архітектура - виберіть стандартну архітектуру arm64 armv7 armv7s. Трохи нижче у Важливій архітектурі виробляється користувач arm64 armv7 armv7s включений. Це працювало для мене.


0

Я вирішив цю проблему, використовуючи відповідь @ Kjuly та конкретний рядок:

"Причина, яку не вдалося створити, може бути в тому, що проект не підтримує архітектуру пристрою, який ви підключили."

З завантаженням Xcode він автоматично встановив мій додаток iPad на iPad Air

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

Це спричинило помилку аналізу залежності.

Зміна типу пристрою негайно вирішила проблему:

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

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


0

Я виявив, що потрібно вводити назви архітектури вручну:

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

Я не знаю, чому це було потрібно, тобто чому ці значення не успадковувалися від самого Xcode. Але як тільки я це зробив, проблема пішла.


0

В Дійсні архітектури: Виберіть кожну запис (випуск, налагодження) та складіть та натисніть назад. Це має працювати

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