Creación de Xcode para iOS Simulator, pero vinculación en un archivo objeto creado para iOS, para la arquitectura 'arm64'
Estoy intentando crear un proyecto grande (¡y trabajando en Xcode 11!) en Xcode 12 (beta 5) para prepararme para iOS 14. El código base estaba anteriormente en Objective-C, pero ahora contiene Objective-C y Swift. y también utiliza pods que son Objective-C y/o Swift.
Obtuve la nueva versión beta de CocoaPods con soporte para Xcode 12 (actualmente 1.10.0.beta 2).
La instalación del pod se realizó correctamente. Cuando hago una compilación, aparece el siguiente error en un marco de pod:
compilación para iOS Simulator, pero vinculación en un archivo objeto creado para iOS, para arquitectura arm64
y posiblemente también el error:
No se puede cargar la biblioteca estándar para el objetivo 'arm64-apple-ios11.0'
Cuando ejecuto lipo -info
el framework, tiene: armv7s armv7 i386 x86_64 arm64.
Anteriormente, el proyecto tenía arquitecturas válidas configuradas en: armv7, armv7s y arm64.
En Xcode 12, esa configuración desaparece, según la documentación de Apple. Las arquitecturas están configuradas en $(ARCHS_STANDARD). No tengo nada configurado en arquitecturas excluidas.
¿Qué puede estar pasando aquí? Todavía no he podido reproducir esto con un proyecto más simple.
Básicamente, debe excluir arm64
de la arquitectura del simulador, tanto de su proyecto como del proyecto Pod.
Para hacer eso, navegue hasta Configuración de compilación de su proyecto y agregue Cualquier SDK de simulador de iOS con valor
arm64
dentro de Arquitectura excluida .
O
Si está utilizando
XCConfig
archivos personalizados, simplemente puede agregar esta línea para excluir la arquitectura del simulador.EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
Entonces
Debe hacer lo mismo para el proyecto Pod hasta que todos los proveedores de Cocoa pod hayan terminado de agregar lo siguiente en su Podspec .
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
Puedes agregar manualmente la arquitectura excluida en la configuración de compilación de tu proyecto Pod , pero se sobrescribirá cuando la uses
pod install
.En lugar de esto, puede agregar este fragmento en su archivo
Podfile
. Escribirá la configuración de compilación necesaria cada vez que ejecutepod install
.post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end end
TL;DR;
Establezca "Construir solo arquitectura activa ( ONLY_ACTIVE_ARCH
)" en Sí para sus bibliotecas/aplicaciones, incluso para el modo de lanzamiento .
Mientras intentaba identificar la causa raíz del problema, me di cuenta de algunos datos divertidos sobre Xcode 12.
Xcode 12 es en realidad el trampolín para el silicio de Apple que desafortunadamente aún no está disponible ( cuando se escribió la respuesta ). Pero con esa plataforma obtendremos un macOS basado en arm64 donde los simuladores también se ejecutarán en la arquitectura arm64 a diferencia de la arquitectura x86_64 basada en Intel actual .
Xcode generalmente depende del "Destino de ejecución" para crear sus bibliotecas/aplicaciones. Entonces, cuando se elige un simulador como "Destino de ejecución", se crea la aplicación para las arquitecturas de simulador disponibles y cuando se elige un dispositivo como "Destino de ejecución", se crea para la arquitectura que admite el dispositivo (
arm*
).xcodebuild
, en el sistema de compilación Xcode 12+ se consideraarm64
una arquitectura válida para que el simulador sea compatible con Apple Silicon. Entonces, cuando se elige un simulador como destino de ejecución, también puede intentar compilar/vincular sus bibliotecas/aplicaciones conarm64
simuladores basados. Entonces envíaclang(++)
algún indicador -target comoarm64-apple-ios13.0-simulator
en el formato <architecture>-<os>-<sdk>-<destination> y clang intenta construir/vincular contra un simulador basado en arm64 que eventualmente falla en una Mac basada en Intel.Pero
xcodebuild
intenta esto solo para versiones de lanzamiento . ¿Por qué? Porque,ONLY_ACTIVE_ARCH
la configuración de compilación "Construir solo arquitectura activa ()" generalmente se establece en "No" solo para la configuración de "Versión". Y eso significa quexcodebuild
intentará crear todas las variantes arquitectónicas de sus bibliotecas/aplicaciones para el destino de ejecución seleccionado para las versiones de lanzamiento. Y para el destino de ejecución del simulador, incluirá ambosx86_64
yarm64
de ahora en adelante, ya quearm64
en Xcode 12+ también hay una arquitectura compatible para simuladores que admiten Apple Silicon.
En pocas palabras, Xcode no podrá compilar su aplicación cada vez que intente la línea de comando, xcodebuild
(que de manera predeterminada es lanzar la compilación, consulte la pestaña general de la configuración de su proyecto) o de otra manera e intente compilar todas las variantes arquitectónicas admitidas por el destino de ejecución . Entonces, una solución alternativa simple a este problema es configurar "Construir solo arquitectura activa ( ONLY_ACTIVE_ARCH
)" en Sí en sus bibliotecas/aplicaciones, incluso para el modo de lanzamiento.
Si las bibliotecas están incluidas como Pods y tienes acceso a ellas, .podspec
simplemente puedes configurar:
spec.pod_target_xcconfig = { 'ONLY_ACTIVE_ARCH' => 'SÍ' }
spec.user_target_xcconfig = { 'ONLY_ACTIVE_ARCH' => 'YES' } # no recomendado
Personalmente, no me gusta la segunda línea, ya que los pods no deberían contaminar el proyecto de destino y podrían anularse en la configuración de destino. Por lo tanto, debería ser responsabilidad del proyecto del consumidor anular la configuración de alguna manera. Sin embargo, esto podría ser necesario para lograr una eliminación exitosa de las especificaciones de pod.
Sin embargo, si no tienes acceso a .podspec
, siempre puedes actualizar la configuración durante la instalación de los pods:
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
Una cosa que me preocupaba era cuál será el impacto de esto cuando realmente archivemos las bibliotecas y aplicaciones. Durante el archivado, las aplicaciones generalmente toman la configuración de "Lanzamiento" y dado que esto creará una compilación de lanzamiento considerando solo la arquitectura activa del destino de ejecución actual, con este enfoque, podemos perder las porciones para armv7, armv7s, etc. de la compilación de destino. . Sin embargo, noté que la documentación dice (resaltada en la imagen adjunta) que esta configuración se ignorará cuando elegimos "Dispositivo iOS genérico/Cualquier dispositivo" como destino de ejecución, ya que no define ninguna arquitectura específica. Así que supongo que deberíamos ser buenos si archivamos nuestra aplicación eligiéndola como destino de ejecución.
¡Encontré una solución! Las vistas previas de SwiftUI no funcionan con Firebase
Si configura arquitecturas excluidas para el simulador en arm64, se compilará.