Xcode 5.1-нет архитектуры для компиляции (только ACTIVE ARCH=YES, active 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).

Это мои целевые параметры построения:

Я попытался изменить "построить активную архитектуру "на нет, а также добавить" i386 "к" допустимым архитектурам", к сожалению, ни один из них не работал. Спасибо за любые предложения!

18 165

18 ответов:

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

  1. удалите проект "стручки" из рабочей области в левой панели Xcode и закройте Xcode.
  2. запустите " pod install "из командной строки, чтобы воссоздать проект" Pod".
  3. повторно откройте Xcode и убедитесь, что "построить только активную архитектуру" имеет значение "нет" в настройках сборки как проекта "стручки", так и вашего собственного проект.
  4. "очистить и построить".

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


EDIT:

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


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

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

Если вы используете CocoaPods, наиболее вероятная проблема заключается в том, что ваши настройки сборки проекта Pods для Построение Архитектуры Active Только установлено значение да для отладки.

решение простое. Измените его на нет.

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

У меня была аналогичная проблема. Получил его решить, изменив "архитектура" на " $(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, несмотря на то, что мой Подфайл имел platform :ios. Я использую cocoapods 0.35.0.алгоритм RC2.

чтобы исправить это, выберите проект Стручков в навигаторе проектов и проверьте, что узел проекта стручков (имейте в виду, а не цель стручков) нацелен на iOS. То есть, параметры сборки архитектуры должны быть:

  • архитектур: $(ARCHS_STANDARD)
  • Base SDK:iOS 8.1
  • Поддерживаемые Платформы: iOS
  • действительный архитектур: $(ARCHS_STANDARD)

Я также хотел построить все архитектуры, поэтому я добавил следующее В Подфайл:

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

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

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

Я столкнулся с той же проблемой при запуске моего приложения на iPad с помощью Xcode 5.1. Он был разрешен путем удаления armv7s из "допустимых архитектур" и установки значения "строить только активные архитектуры" в No. Оба эти поля можно найти в вашем приложении->цели->параметры сборки->архитектуры.

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

в acrhiecture-иногда для поддержки 6.0 и 7.0, мы исключаем arm64

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

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

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

при загрузке Xcode он автоматически устанавливает мое приложение iPad на iPad Air

enter image description here

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

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

enter image description here

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

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

enter image description here

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

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