TL; DR;
Встановіть для параметра "Build Active Architecture Only ( ONLY_ACTIVE_ARCH
)" значення " Так" для ваших бібліотек / програм, навіть для режиму випуску .
Намагаючись визначити першопричину проблеми, я зрозумів кілька цікавих фактів про Xcode 12.
Xcode 12 насправді є сходинкою для Apple Silicon, яка, на жаль, поки що недоступна. Але з цією платформою ми отримаємо macOS на базі arm64, де симулятори також працюватимуть на архітектурі arm64, на відміну від сучасної архітектури x86_64 на базі Intel.
Xcode зазвичай залежить від "Виконати призначення" для створення своїх бібліотек / програм. Отже, коли симулятор вибирається як "Призначення запуску", він створює додаток для доступних архітектур симулятора, а коли пристрій вибирається як "Призначення запуску", він створює для архітектури, яку підтримує пристрій ( arm*
).
xcodebuild
, в системі побудови Xcode 12+ розглядається arm64
як діюча архітектура для симулятора. Отже, коли вибраний симулятор призначений для запуску, він потенційно може спробувати скомпілювати / зв’язати ваші бібліотеки / програми з arm64
базованими симуляторами (поки що недоступний). Таким чином, він надсилає clang(++)
деякий прапор -target, як arm64-apple-ios13.0-simulator
у форматі <architecture> - <os> - <sdk> - <platform>, і clang намагається побудувати / зв'язати симулятор на основі arm64, який врешті-решт виходить з ладу на Mac, що базується на Intel.
Але xcodebuild
пробує це лише для збірки Release . Чому? Оскільки для параметрів збірки "Build Active Architecture Only ( ONLY_ACTIVE_ARCH
)", як правило, встановлюється значення "Ні" лише для конфігурації "Release". А це означає xcodebuild
, що ми спробуємо побудувати всі архітектурні варіанти ваших бібліотек / програм для обраного пункту запуску для збірок випуску. І для призначення запуску Simulator, він буде включає в себе як x86_64
і arm64
тепер, так як arm64
в Xcode 12+ також підтримується архітектура для тренажерів для підтримки Apple , кремній.
Простіше кажучи, Xcode не зможе побудувати вашу програму в будь-який час, коли вона спробує командний рядок, xcodebuild
(який за замовчуванням випускає збірку, див. Загальну вкладку налаштувань вашого проекту) або іншим чином і намагається створити всі архітектурні варіанти, що підтримуються призначенням запуску . Тож простим обхідним шляхом для цього питання є встановлення значення "Build Active Architecture Only ( ONLY_ACTIVE_ARCH
)" у " Так" у ваших бібліотеках / додатках, навіть для режиму випуску.
Якщо бібліотеки включені як Pods і у вас є доступ до них, .podspec
ви можете просто встановити:
spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'ТАК'}
spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'ТАК'} # не рекомендується
Мені особисто не подобається другий рядок, оскільки стручки не повинні забруднювати цільовий проект, і він може бути замінений у самих цільових налаштуваннях. Отже, відповідальність за споживчий проект повинна перекрити налаштування якимось чином. Однак це може бути необхідним для успішного з'єднання підспецій.
Однак, якщо у вас немає доступу до .podspec
, ви завжди можете оновити налаштування під час встановлення стручків:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
Одне мене турбувало, що це вплине на це, коли ми насправді архівуємо бібліотеки / програми. Під час архівування додатки зазвичай беруть конфігурацію "Release", і оскільки це буде створювати збірку випуску, враховуючи лише активну архітектуру поточного пункту призначення, за такого підходу ми можемо втратити фрагменти для armv7, armv7s тощо від цільової збірки. Однак я помітив, що в документації сказано (виділено на вкладеному малюнку), що цей параметр буде проігноровано, коли ми виберемо "Загальний пристрій iOS / Будь-який пристрій" як пункт призначення, оскільки він не визначає жодної конкретної архітектури. Отже, я думаю, нам слід бути добре, якщо ми заархівуємо наш додаток, вибравши його як пункт запуску.