Xcode 5.1 - нет архитектур для компиляции (ONLY_ACTIVE_ARCH=YES, активная arch=x86_64, VALID_ARCHS=i386)

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

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

Это мои настройки сборки цели:

Настройки сборки цели XCode

Я попытался изменить "Build Active Architecture" на "No", а также добавить "i386" в "Valid Architecture", но, к сожалению, ничего не получилось. Спасибо за любые предложения!

18 ответов

Решение

У меня было то же сообщение об ошибке после обновления до XCode 5.1. Вы используете CocoaPods? Если так, это должно решить проблему:

  1. Удалите проект "Pods" из рабочей области в левой панели Xcode и закройте Xcode.
  2. Запустите "pod install" из командной строки, чтобы воссоздать проект "Pods".
  3. Снова откройте Xcode и убедитесь, что "Build Active Architecture Only" имеет значение "No" в настройках сборки проекта "Pods" и вашего собственного проекта.
  4. Очистить и построить.

Что вам нужно сделать, это просто установить ONLY_ACTIVE_ARCH в NO (по крайней мере у меня работает). Ниже приведен скриншот для этого:


РЕДАКТИРОВАТЬ:

Насколько я знаю (пожалуйста, укажите, если что-то не так, спасибо), если вы установите ONLY_ACTIVE_ARCH в YES, это означает, что XCode будет собираться только для активной архитектуры (которая относится к устройству, которое в настоящее время активно в XCode). Кажется, для Xcode по умолчанию установлено значение Debug 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 " работает? Потому что устройство все еще может запускать бинарный файл, созданный для всех добавленных вами архитектур (пройти сборку), но потерять некоторую производительность. Это просто быстрое решение, но не лучшее.


Примечание. Чем больше архитектур вы добавили, тем больше будет создан двоичный файл. Поэтому хорошо выбрать правильную архитектуру для вашего проекта.;)

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

Если вы используете CocoaPods, наиболее вероятная проблема заключается в том, что в вашем проекте "Настройки сборки" для " Только активная архитектура" для "Отладка" установлено значение " Да".

Решение простое. Измените это на Нет.

Аналогично, измените на Нет для вашего проекта приложения.

У меня была похожая проблема. Решил проблему, изменив "Архитектура" на "$ (ARCHS_STANDARD_32_BIT)" в настройках сборки для проекта.

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

Добавить: Архитектура: $(ARCHS_STANDARD_INCLUDING_64_BIT)

Допустимые архитектуры: arm64 armv7 armv7s

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

Чтобы избежать "pod install" сбрасывать 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

Просто добавьте arm64 в правильную архитектуру. Я надеюсь, что это будет работать для вас.

Моя проблема заключалась в том, что проект Pods был ориентирован на OS X, несмотря на то, что мой Podfile имел platform :ios, Я использую cocoapods 0.35.0.rc2.

Чтобы исправить это, выберите проект Pods в навигаторе проекта и убедитесь, что узел Pods PROJECT (имейте в виду, не цель 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

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

Я столкнулся с той же проблемой при запуске моего приложения на iPad с использованием xcode 5.1. Эта проблема была решена путем удаления armv7s из "допустимых архитектур" и установки значения "только для активных архитектур" в значение "Нет". Оба этих поля можно найти в вашем приложении->target->build settings->architectures.

Я пришел к этому вопросу из-за проблемы со сборкой командной строки для симулятора в 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

В акриектуре - иногда для поддержки 6.0 и 7.0 мы исключаем arm64

В архитектурах - > архитектура - выберите стандартную архитектуру arm64 armv7 armv7s. Чуть ниже в Valid acrchitecture пользовательский arm64 armv7 armv7s включен. Это сработало для меня.

Я обнаружил, что необходимо было вводить имена архитектур вручную:

Я не знаю, почему это было необходимо, то есть, почему эти значения не были унаследованы от самого Xcode. Но как только я это сделал, проблема ушла.

Попробуйте удалить все предыдущие архитектуры (то есть удалить параметр ARCHS_STANDARD) одновременно с добавлением i386 к архитектурам. Это должно изменить активную архитектуру на i386. Я столкнулся с подобной проблемой, когда пытался собрать для armv7 по умолчанию, но он продолжал пытаться собрать для arm64. Я изменил ARCHS_STANDARD на ARCHS_STANDARD_32_BIT, и это изменило выбранную активную архитектуру.

Я решил эту проблему, используя ответ @Kjuly и конкретную строку:

"Причиной неудачной сборки может быть то, что проект не поддерживает архитектуру подключенного устройства".

С загруженным XCode это автоматически устанавливает мое приложение для iPad на iPad Air

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

Это вызвало ошибку анализа зависимости.

Изменение типа устройства сразу решило проблему:

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

Я не знаю, почему это работает, но это очень быстрый ответ, который избавил меня от необходимости много возиться в фоновом режиме и сразу заставил приложение работать для тестирования. Я бы никогда не подумал, что это может быть что-то, и что-то такое простое исправит это, но в этом случае это так.

В действительных архитектурах: выберите каждую запись (выпуск, отладка), соберите и нажмите клавишу Backspace. Он должен работать

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