Другое

Xcode 12 iOS Simulator arm64 Ошибка: Полное решение

Исправьте ошибку Xcode 12 iOS Simulator arm64 с помощью полного руководства. Узнайте причины и пошаговые решения для обычных проектов и интеграции CocoaPods.

Xcode 12 Build Error: “building for iOS Simulator, but linking in object file built for iOS, for architecture arm64”

Я сталкиваюсь с ошибкой сборки при обновлении с Xcode 11 до Xcode 12 (beta 5) для разработки iOS 14.
Мой проект содержит как Objective‑C, так и Swift код и использует CocoaPods (версия 1.10.0.beta2) с pod‑ами как на Objective‑C, так и на Swift.

После успешного выполнения pod install я получаю следующую ошибку во время сборки pod‑фреймворка:

building for iOS Simulator, but linking in object file built for iOS, for architecture arm64

Иногда появляется также:

Unable to load standard library for target 'arm64-apple-ios11.0'

Проверив фреймворк через lipo -info, я вижу архитектуры: armv7s armv7 i386 x86_64 arm64.

Ранее в проекте у меня было Valid Architectures: armv7, armv7s и arm64.
В Xcode 12 этот параметр заменён на Architectures со значением $(ARCHS_STANDARD), а в Excluded Architectures ничего не указано.

Что может вызывать эту ошибку линковки в Xcode 12 и как её исправить?

Понимание причины ошибки

Ошибка возникает из‑за того, что Xcode 12 кардинально изменил способ проверки архитектур. В предыдущих версиях можно было включать несколько архитектур в сборку, и Xcode автоматически выбирал подходящие для устройства или симулятора. В Xcode 12 введена более строгая проверка, которая запрещает смешивать архитектуры устройств и симуляторов во время связывания.

Согласно анализу на Stack Overflow, «Xcode 12 не позволяет собирать архитектуру arm64 для симулятора». Это означает, что при сборке для iOS Simulator Xcode ожидает только архитектуру x86_64, но ваш проект или фреймворки pod содержат файлы, собранные для arm64, предназначенные для устройств.

Сообщение об ошибке «Unable to load standard library for target ‘arm64-apple-ios11.0’» подтверждает, что линкер пытается использовать библиотеки, специфичные для arm64, в контексте симулятора, где они несовместимы.

Почему эта ошибка возникает в Xcode 12

Xcode 12 внес несколько архитектурных изменений:

  1. Депрецирование Valid Architectures: настройка «Valid Architectures» полностью удалена и заменена на «Architectures», установленную в $(ARCHS_STANDARD). Как отмечено в обсуждениях на Stack Overflow, «В Xcode 12 эта настройка исчезает, согласно документации Apple».

  2. Новые стандарты архитектур: $(ARCHS_STANDARD) теперь включает разные архитектуры в зависимости от цели:

    • Для устройств: arm64, arm64e
    • Для симуляторов: x86_64 (и, возможно, arm64 для Mac на Apple Silicon)
  3. Более строгая проверка линкера: линкер Xcode 12 более строго относится к несовпадениям архитектур, поэтому ошибка связывания появляется чаще.

Если вы проверите ваш фреймворк командой lipo -info и увидите armv7s armv7 i386 x86_64 arm64, это означает, что ваш фреймворк содержит как архитектуры устройств, так и симуляторов. В Xcode 11 это было допустимо, но в Xcode 12 приводит к ошибкам из‑за новых правил проверки.

Пошаговые решения

Решение 1: Исключить arm64 из сборок для iOS Simulator (рекомендовано)

Это наиболее распространённый и надёжный способ решения:

  1. Для основного таргета:

    • Откройте ваш проект в Xcode.
    • Выберите основной таргет приложения.
    • Перейдите в Build Settings.
    • Найдите «Excluded Architectures».
    • Нажмите кнопку «+» для добавления нового значения.
    • Установите условие «Debug» (и повторите для «Release», если нужно).
    • Укажите «Any iOS Simulator SDK».
    • Введите arm64.
  2. Для таргетов Pod (если используете CocoaPods):

    • Выберите проект Pod в Project Navigator.
    • Выберите таргеты Pod.
    • Повторите те же шаги, чтобы добавить arm64 в «Excluded Architectures» для iOS Simulator SDK.

Как отмечает Milan Panchal в Medium‑статье, «Добавление Any iOS Simulator SDK с значением arm64 в Excluded Architectures» предотвращает попытки Xcode собрать arm64 для симулятора.

Решение 2: Установить Build Active Architecture Only в YES

Эффективно для сборок в режиме разработки:

  1. Для основного таргета:

    • Перейдите в Build Settings.
    • Найдите «Build Active Architecture Only» (или ONLY_ACTIVE_ARCH).
    • Установите YES для конфигураций Debug и Release.
  2. Для таргетов Pod:

    • Повторите те же настройки.

Stack Overflow подчёркивает, что «Установите ‘Build Active Architecture Only (ONLY_ACTIVE_ARCH)’ в YES для ваших библиотек/приложений, даже для режима Release» может решить проблему.

Решение 3: Сочетание обоих подходов

Для максимальной надёжности:

  1. Установите «Build Active Architecture Only» в YES для всех таргетов.
  2. Добавьте arm64 в «Excluded Architectures» для сборок iOS Simulator.

Особые соображения для CocoaPods

При использовании CocoaPods в Xcode 12 необходимо применить те же настройки архитектур как к основному проекту, так и к фреймворкам Pod. Это часто является источником ошибки.

Конфигурация для Pod

Как указывает Repeato, «Чтобы предотвратить попытки Xcode собрать arm64 для симулятора, можно исключить эту архитектуру в настройках проекта и Pod проекта».

  1. Редактирование Podfile (необязательно, но рекомендуется):

    ruby
    post_install do |installer|
      installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
          config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
        end
      end
    end
    
  2. Ручная настройка в Xcode:

    • Выберите проект Pod.
    • Выберите каждый таргет Pod.
    • Настройте «Excluded Architectures» как в Решении 1.
  3. Очистка и переустановка Pod:

    bash
    pod deintegrate
    pod cache clean --all
    pod install
    

Документация Dynamsoft также отмечает, что «под User-Defined → найдите VALIDATE_WORKSPACE и установите его в YES» может помочь с проблемами связывания, связанными с Pod.

Продвинутый отладочный процесс

Если стандартные решения не работают, попробуйте следующие подходы:

Ручное редактирование .pbxproj

Иногда графический интерфейс Xcode не применяет изменения корректно, особенно в сложных конфигурациях. Как упомянуто в Apple Developer Forums, «Я удалил arm64 из target>build settings>Excluded Architectures, но это не помогло. После редактирования ios/App/App.xcodeproj/project.pbxproj и удаления EXCLUDED_ARCHS = arm64; проблема исчезла».

Для ручного редактирования:

  1. Откройте файл .pbxproj вашего проекта в текстовом редакторе.
  2. Найдите EXCLUDED_ARCHS.
  3. Убедитесь, что конфигурация правильна для сборок iOS Simulator.
  4. Сохраните и откройте проект в Xcode снова.

Проверка настройки VALIDATE_WORKSPACE

Как указано в документации Dynamsoft, установка VALIDATE_WORKSPACE в YES в User-Defined build settings может решить сложные проблемы связывания.

Настройки, специфичные для архитектур

Для проектов с сложными требованиями к архитектурам может понадобиться конфигурировать разные настройки для разных архитектур:

  1. Установите «Architectures» в $(ARCHS_STANDARD) (по умолчанию Xcode 12).
  2. Настройте «Excluded Architectures» в зависимости от цели:
    • Для устройств: исключите i386, x86_64.
    • Для симуляторов: исключите arm64, armv7, armv7s.

Предотвращение и лучшие практики

Подготовка к будущим версиям Xcode

Чтобы избежать подобных проблем в будущих версиях Xcode:

  1. Используйте $(ARCHS_STANDARD): придерживайтесь стандартных настроек Xcode 12.
  2. Правильно настраивайте Excluded Architectures: всегда указывайте условие SDK (например, sdk=iphonesimulator*).
  3. Регулярно обновляйте Pods: держите CocoaPods в актуальном состоянии для совместимости с новыми версиями Xcode.

Лучшие практики управления архитектурами

  1. Разделяйте сборки для устройств и симуляторов: рассмотрите возможность использования разных конфигураций сборки.
  2. Используйте условные настройки сборки: применяйте условные build settings на основе SDK или платформы.
  3. Регулярно очищайте папку сборки: используйте Product → Clean Build Folder для чистых сборок.

Мониторинг совместимости архитектур

  1. Регулярно проверяйте архитектуры: используйте lipo -info для проверки архитектур фреймворков.
  2. Анализируйте логи сборки: обращайте внимание на предупреждения и ошибки, связанные с архитектурами.
  3. Тестируйте на нескольких таргетах: убедитесь, что сборки работают как на устройстве, так и в симуляторе.

Batch.com подчеркивает, что «сначала откройте Build Settings основного таргета и разверните Excluded Architectures» — ключ к решению проблем связывания, связанных с архитектурами, в Xcode 12.

Источники

  1. Xcode building for iOS Simulator, but linking in an object file built for iOS, for architecture ‘arm64’ - Stack Overflow
  2. Xcode 12, building for iOS Simulator, but linking in object file built for iOS, file for architecture arm64 | by Milan Panchal | Medium
  3. Resolving the “Building for iOS Simulator, but Linking in an Object File Built for iOS” Error in Xcode - Repeato
  4. iOS simulator Error - DBR iOS FAQs
  5. ld: building for iOS Simulator, but linking in dylib built for iOS - Apple Developer Forums
  6. Xcode12 Error: building for iOS Simulator, but linking in object file built for iOS,for architecture arm64 | by Hsin | Medium
  7. Xcode 12 fails to build a project containing Batch | Help Center — Batch
  8. Xcode 12, building for iOS Simulator, but linking in object file built for iOS, file for architecture arm64 - Hashnode

Вывод

Ошибка связывания «building for iOS Simulator, but linking in object file built for iOS, for architecture arm64» в основном вызвана более строгой проверкой архитектур в Xcode 12 и удалением настройки Valid Architectures. Чтобы решить проблему:

  1. Добавьте arm64 в «Excluded Architectures» для сборок iOS Simulator.
  2. Примените те же настройки к основному проекту и к таргетам Pod.
  3. При необходимости включите «Build Active Architecture Only» в YES.
  4. Для сложных проектов можно редактировать .pbxproj вручную или использовать скрипт в Podfile.

Следуя этим рекомендациям и придерживаясь лучших практик управления архитектурами, вы сможете избежать подобных ошибок в будущих версиях Xcode и поддерживать совместимость как с устройствами, так и с симуляторами.

Авторы
Проверено модерацией
Модерация