Ошибка Xcode «создание для iOS Simulator, но соединение в dylib, созданном для iOS .. для архитектуры arm64» от Apple Silicon M1 Mac

У меня есть приложение, которое компилируется и отлично работает на старых компьютерах Mac с процессорами Intel на физических устройствах и симуляторах iOS.

Это же приложение также компилируется и отлично работает на новом Apple Silicon Mac с процессором M1 с физическими устройствами iPhone, но оно отказывается компилироваться для симулятора iOS.

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

Первая ошибка, с которой я столкнулся, не внося никаких изменений (но перенесенная с Intel Mac на M1 Mac), выглядит следующим образом.

building for iOS Simulator, but linking in dylib built for iOS, file '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64

Библиотека Cocoapods, которую я использую, - это GoogleWebRTC, и, согласно ее документу, arm64 должен поддерживаться, поэтому я сбит с толку, почему возникает ошибка выше. Как я уже сказал, он отлично компилируется на реальном устройстве, которое, как я полагаю, работает на arm64.

Согласно док ..

Этот модуль содержит SDK WebRTC для iOS в двоичной форме. Это динамическая библиотека, содержащая срезы armv7, arm64 и x86_64. Битовый код не поддерживается. В настоящее время предоставляемые нами API предназначены только для цели C.

Я искал в Интернете и похоже, есть 2 способа решения этой проблемы.

  1. Первый - добавлением arm64 к Excluded Architectures
  2. Второй вариант - пометить Build Active Architecture Only для сборки Release.

Я не совсем понимаю, необходимо ли это, даже когда я компилирую свое приложение на M1 Mac, которое работает под архитектурой arm64, потому что решение, похоже, применимо только для Intel Mac, который не поддерживает симулятор arm64, как для Intel Mac , симуляторы могли работать в x86_64, а не в arm64, поэтому решение №1 в моем случае неприменимо.

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

Когда я вношу оба изменения и пытаюсь построить, теперь я получаю следующую вторую ошибку во время сборки. (не совсем уверен на 100%, решил ли я 1-ю ошибку / я мог бы ввести 2-ю ошибку в дополнение к 1-й, адаптировав два изменения)

Could not find module 'Lottie' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator

Вторая библиотека, которую я использую, - это lottie-ios, и я использую ее в быстром пакете. менеджер. Я предполагаю, что происходит следующее: поскольку я исключил arm64 в настройках сборки для симулятора iOS, Xcode пытается запустить мое приложение в x86_64. Однако библиотека по какой-то причине не поддерживается в x86_64 и выдает ошибку. У меня нет особого представления о том, что определяет, может ли библиотека работать в x86_64 или arm64, поэтому я не мог копать, чтобы исследовать эту проблему.

Мой слабый вывод состоит в том, что GoogleWebRTC не может быть скомпилирован для запуска в симуляторе iOS с arm64 по какой-то причине (в отличие от того, что его документ говорит), и lottie-ios не может быть скомпилирован для работы в симуляторе iOS с x86_64. Поэтому я не могу использовать их оба в этом случае.

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

Приложение компилируется и отлично работает как на устройстве, так и в симуляторе при компиляции с Intel Mac. Приложение компилируется и отлично работает на устройстве при компиляции из Apple Silicon Mac. Просто это приложение отказывается компилироваться и запускаться в симуляторе iOS от Apple Silicon Mac, и я не могу понять, почему.

Q2. Если решения нет, я хочу понять, почему это вообще происходит.

Я действительно не хочу снова покупать старый Intel Mac просто для того, чтобы все работало в симуляторе.


person user482594    schedule 31.01.2021    source источник
comment
Столкнулся с похожей проблемой. Вы нашли решение Could not find module 'X' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator проблемы?   -  person Martin Dinh    schedule 07.02.2021
comment
Я отправил ответ. Я надеюсь, что это поможет с вашей проблемой ..   -  person user482594    schedule 08.02.2021


Ответы (2)


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

Я обнаружил, что GoogleWebRTC на самом деле требует, чтобы его источник был скомпилирован с x64 на основе его исходного депо.

Для сборок, ориентированных на устройства iOS, это должно быть установлено на arm или arm64, в зависимости от архитектуры устройства. Чтобы сборки запускались в симуляторе, должно быть установлено значение x64.

https://webrtc.github.io/webrtc-org/native-code/ios/

Должно быть, поэтому я получил следующую ошибку.

building for iOS Simulator, but linking in dylib built for iOS, file '/Users/andy/workspace/app/Pods/GoogleWebRTC/Frameworks/frameworks/WebRTC.framework/WebRTC' for architecture arm64

Пожалуйста, поправьте меня, если я ошибаюсь, но по умолчанию кажется, что Xcode, работающий на кремнии Apple M1, запускает симулятор iOS с типом арки arm. Поскольку мое приложение отлично работало на симуляторах на Intel Mac, я сделал следующее в качестве временного решения.

  1. Закройте Xcode.
  2. Перейдите в Finder и откройте папку приложения.
  3. Щелкните правой кнопкой мыши приложение Xcode, выберите Get Info
  4. В информационном окне Xcode проверьте Open using Rosetta.
  5. Откройте Xcode и попробуйте снова запустить.

Это было все, что мне нужно было сделать, чтобы мое приложение, основанное на библиотеке, которая еще не полностью поддерживается симулятором руки, снова заработало. (Я считаю, что запуск Xcode в режиме Rosetta также запускает симулятор в x86 .. ?? что объясняет, почему все работает после внесения вышеуказанного изменения)

Во многих онлайн-источниках (часто публикуемых перед запуском M1 Mac в ноябре 2020 г.) говорится о добавлении arm64 в Excluded Architectures, но это решение, похоже, применимо только к Intel Mac, а не M1 Mac, так как мне не нужно было вносить это изменение. чтобы все снова заработало.

Конечно, запуск Xcode в режиме Rosetta не является постоянным решением, и Xcode немного замедляет работу, но это временное решение, которое запускает работу в случае, если одна из библиотек, которые вы используете, не запускается в симуляторе arm64 ... пока.

person user482594    schedule 07.02.2021
comment
Итак, вы создаете приложение x86, работающее на симуляторе x86 на процессоре ARM. Я предполагаю, что будет несколько сценариев сборки, предполагающих, что симулятор работает на x86. - person gnasher729; 27.03.2021
comment
Большое спасибо @ user482594. Это сработало :) - person Shivani Bajaj; 17.06.2021
comment
Я нашел другой обходной путь, без использования Rosetta. Хотя мое приложение не работает в текущем симуляторе iOS, оно работает, например, в iPhone 11 Pro (13.0). Я не уверен, но у меня сложилось впечатление, что этот симулятор не использует архитектуру arm64, в отличие от iPhone 12 Pro Simulator или даже iPhone 11 Pro (14.5). Интересно, работает ли это и для вас? - person Adriano; 29.06.2021

Закройте Xcode. Перейдите в Finder и откройте папку приложения. Щелкните правой кнопкой мыши приложение Xcode, выберите "Получить информацию". В информационном окне Xcode установите флажок "Открыть с помощью Rosetta". Откройте Xcode и попробуйте снова запустить. введите здесь описание изображения

person Amal Jose    schedule 14.06.2021