Цель сборки Xcode 12 в неправильном порядке для симулятора?

Мой проект всегда работает правильно на всех устройствах, использующих Xcode 11, но после того, как я установил Xcode 12 beta 4, он не может быть построен на симуляторе.

Я сравнил журналы сборки Xcode 11 и Xcode 12, и в Xcode 12 кажется, что моя основная цель строится до цели какао-стручков, поэтому ссылка не удастся, потому что библиотека cocoapods не будет найдена.

Как исправить порядок цели сборки?

В Xcode 11 все нормально. Моя собственная цель построена после цели по коконоду.

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

В Xcode 12 сборка нарушена. Моя собственная цель построена до цели cocoapods.

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


person ximmyxiao    schedule 13.08.2020    source источник
comment
Возможно, stackoverflow.com/questions/ 10285964 /?   -  person Larme    schedule 13.08.2020
comment
@Larme, это не тот же вопрос, ссылка, которую вы публикуете, находится в том же проекте, но мой проект использует рабочую область, я не могу явно установить целевую зависимость в другом проекте   -  person ximmyxiao    schedule 13.08.2020
comment
@Larme, и на самом деле, мой проект все еще работает нормально в xcode 11, он будет сбой только в xcode 12, поэтому я думаю, что это может быть какой-то механизм в xcode, вызывающий эту проблему   -  person ximmyxiao    schedule 13.08.2020
comment
2 предоставленных ответа привели меня в правильном направлении, но не решили проблему. Вот что сработало для меня: stackoverflow.com/a/63955114/427969   -  person user427969    schedule 13.10.2020


Ответы (5)


Хорошо, у меня есть способ заставить сборку работать (этот способ исправить проблему неверен, правильный способ исправления добавлен в мое обновление):

1 вам необходимо добавить проект Pods в ваш основной проект как внешний проект

2 явно добавьте все цели cocodpods в качестве зависимостей на этапе сборки вашего основного проекта

Но я все еще думаю, что, возможно, новая бета-версия xcode 12 исправит это. потому что это похоже на ошибку xcode 12 (мой проект отлично работает на устройстве xcode 11 и xcode 12 + ios, сбой только в симуляторе xcode 12 +)

### Обновление 2020-08-17 ###

Я нашел более точную причину для воспроизведения этой проблемы, похоже, мой файл проекта, открытый в xcode 12, автоматически сгенерирует макрос VALID_ARCHS в User-Defines, и этот макрос приведет к сбою сборки

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

И я обнаружил, что с помощью этого макроса во время создания LINK целевым типом ссылки будет неизвестный тип 'arm64-apple-ios11.0-simulator', что приведет к сбою сборки и проблема в том, что все цели строятся в неправильном порядке, кажется, произойдет только при добавлении этого макроса

XcodeDefault.xctoolchain/usr/bin/clang -target arm64-apple-ios11.0-simulator 

после того, как я удалю этот макрос VALID_ARCHS, целевой тип ссылки будет «x86_64-apple-ios11.0-simulator», и все будет хорошо

XcodeDefault.xctoolchain/usr/bin/clang -target x86_64-apple-ios11.0-simulator 

#### 2020-09-11 добавить Добавить отзыв Apple об этом макросе ####

update Apple's Feedback on VALID_ARCHS
  • После рассмотрения вашего отзыва у нас есть для вас дополнительная информация:

  • Xcode не добавляет в ваш проект VALID_ARCHS. Действительно, мы не рекомендуем использовать VALID_ARCHS. Может быть, какой-то CocoaPod по какой-то причине устанавливает его в вашем проекте? CocoaPods не являются частью Xcode, поэтому у нас нет никакого контроля над тем, что они делают.

    Следует отметить, что в Xcode 11 VALID_ARCHS появился в разделе «Архитектура». Поскольку мы настоятельно не рекомендуем его использовать, он больше не отображается там и теперь отображается в разделе «Определено пользователем», если он вообще определен.

  • Xcode 11 раньше автоматически переводил сборку для arm64 для симулятора в сборку для x86_64, но теперь, когда arm64 является допустимой архитектурой симулятора (это архитектура Apple Silicon), такой трансляции больше не происходит.

  • Итак, мы подозреваем, что вам следует полностью удалить VALID_ARCHS из вашего проекта и убедиться, что для Архитектур (ARCHS) установлено значение Стандартные архитектуры (ARCHS_STANDARD), а не что-то конкретное (если вы действительно не знаете, почему вы не используете ARCHS_STANDARD) .

#### Конец обратной связи ####

#### 2020-10-10 добавлено ####

сборка может по-прежнему не работать после удаления макроса VALID_ARCHS для некоторых парней, вы можете проверить ответ добавленной обратной связи Apple и ответ @Andrei Herford ниже:

убедитесь, что для параметра "Архитектура" (ARCHS) установлено значение "Стандартные архитектуры" (ARCHS_STANDARD)

а затем удалите макрос, надеюсь, эти два шага сработают для всех :)

#### 2020-10-10 добавлен конец ####

person ximmyxiao    schedule 14.08.2020
comment
Вы должны сообщить об этом в Apple, если это ошибка только в симуляторе. - person matt; 14.08.2020
comment
@matt, на самом деле я не знаю, как оставить отзыв в Apple -_- - person ximmyxiao; 14.08.2020
comment
@AndrewSas так рад помочь тебе исправить это, братан :) - person ximmyxiao; 22.09.2020
comment
Спасибо за исправление, но в xCode 11 параметр VALID_ARCH находится в другом разделе - Архитектура, поэтому он присутствует и в xCode 11. но xCode 12 не будет строиться на Simulator с этой настройкой - person RemembranceNN; 24.09.2020
comment
@ RemembranceNN, ДА, Apple говорит, что XCode12 переместит этот макрос в User-Defined (потому что они не рекомендовали этот макрос), кажется, это перемещение вызывает проблему - person ximmyxiao; 25.09.2020

Мне удалось решить проблему как в симуляторе, так и на устройстве, используя $(ARCHS_STANDARD) не только для ARCHS в настройках архитектуры, но также и в VALID_ARCHS. Я не уверен, какой побочный эффект может иметь такое изменение арок, но пока у меня не возникло никаких новых проблем.

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

Подробности:

Отличный ответ @ximmyxiao направил меня на верный путь. Однако предложенное им решение (удалить VALID_ARCHS) у меня не сработало. Это привело к новой проблеме при компиляции целей Pod (Command PhaseScriptExecution failed with a nonzero exit code и ARCHS[@]: unbound variable в скрипте Pod).

Вместо замены arm64 на x86_64 в VALID_ARCHS проблема при сборке для симулятора была решена. Кажется, что arm64 никогда не был правильной платформой и был переведен на x86 с помощью Xcode. Поскольку Apple объявила о своем переходе на процессоры ARM, этот перевод больше не является правильным, и поэтому вместо этого нужно использовать правильную платформу x86_64.

Что касается Apple, VALID_ARCHS больше не должен использоваться. Однако это исправление не сработало при сборке для устройств. В конечном итоге использование $(ARCHS_STANDARD) (как для симулятора, так и для устройства) помогло в обоих случаях.

Добрый день тем, кто сталкивается с подобными проблемами. Никогда не надоест работать с Xcode ....

person Andrei Herford    schedule 01.10.2020
comment
Это должен быть принятый ответ. По крайней мере, если вы используете CocoaPods! - person Jeroen; 08.10.2020
comment
Спасибо @Andrei Herford, как и говорит Apple, может быть, мы должны убедиться, что для архитектуры (ARCHS) установлено значение Стандартные архитектуры (ARCHS_STANDARD), прежде чем удалять VALID_ARCHS - person ximmyxiao; 10.10.2020
comment
@ximmyxiao В моем случае для ARCHS уже было установлено значение ARCHS_STANDARD, но это не решило проблему. Независимо от того, какое значение я установил для VALID_ARCHS. Удаление (= пусто) пустых VALID_ARCHS стандартами ARCHS допустило ошибку ARCHS[@]: unbound variable. Только использование ARCHS_STANDARD как в ARCHS, так и в VALID_ARCHS решило проблему. - person Andrei Herford; 12.10.2020
comment
@JeroenJK Вы видели мою правку, которую я добавил несколько дней назад? Замена arm64 на x86_64 решила проблему только в симуляторе. Чтобы запустить проект на устройстве, мне пришлось изменить VALID_ARCHS на $(ARCHS_STANDARD) - person Andrei Herford; 13.10.2020
comment
Я не могу найти VALID_ARCHS в Xcode 12.1 ?? Пожалуйста, предложите - person iMinion; 21.10.2020

** Для XCode 12.4 **

У меня есть Apple MB Pro с M1 и проект с Moya POD и многие другие. Приложение идеально подходит для старых MacBook на базе Intel с той же версией XCode (12.4). Но для M1 он не компилируется, говорит: Моя не найдена. Какие??

Он сказал: Не удалось найти модуль «Моя» для цели «x86_64-apple-ios-simulator»; найдено: arm64, arm64-apple-ios-simulator.

Никакие предложения у меня не работали. Так что мне помогли:

  • (не уверен, нужно ли это): переустановите все модули путем установки модуля
  • очистить данные сборки
  • запуск через Rosette (проверьте это в свойствах приложения XCode cmd + i)

в проекте приложения:

  • Архитектуры: добавить x86_64
  • Только создание активной архитектуры: ДА

в проекте Pods конфликтующий раздел pod (в моем случае Moya):

  • Только создание активной архитектуры: ДА

Затем перестройте. Возможно, потребуется следующая перестройка.

person Sergey    schedule 19.03.2021
comment
спасибо, это наконец-то сработало для меня после того, как я попробовал много вариантов ???? - person Nicolas Sturm; 04.04.2021
comment
святые шары, добавив x86_64 в проекты, архитектуры работали. наконец! - person Iskeraet; 12.04.2021
comment
Кроме того, я заметил следующую закономерность: например, после первой сборки для успешной симуляции все в порядке, последующие сборки для других симуляторов также идеальны. Но если вы начнете с неудачного сима, вы не сможете строить. В моем случае успешной была sim-карта с ios 13, а неудачной - с ios 14.2. - person Sergey; 13.04.2021

Для Xcode версии 12.1. Если вы не можете найти VALID_ARCHS Добавление ** $ (ARCHS_STANDARD) x86_64 i386, все три в Архитектурах решат проблему для запуска на симуляторах и Устройствах, архивирование. также предлагается добавить Только сборку активной архитектуры в поле Да. введите описание изображения здесь

person iMinion    schedule 22.10.2020

Вот что у меня сработало.

  1. Удалено VALID_ARCHS из пользовательских настроек
  2. Установите ARCHS на $(ARCHS_STANDARD)
  3. Создал новый .xcconfig файл для своего проекта. (Если он у вас уже есть, вы можете пропустить это)
  4. Добавил их в мой .xcconfig файл
EXCLUDED_ARCHS[sdk=iphoneos*] = x86_64
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

После этого я могу создавать как симулятор, так и устройство. Идея состоит в том, чтобы исключить arm64 при сборке на симуляторах и x86_64 на устройствах.

person cessmestreet    schedule 22.01.2021