Creación de Xcode para iOS Simulator, pero vinculación en un archivo objeto creado para iOS, para la arquitectura 'arm64'

Resuelto btxios asked hace 54 años • 66 respuestas

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 -infoel 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.

btxios avatar Jan 01 '70 08:01 btxios
Aceptado

Básicamente, debe excluir arm64de 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 arm64dentro de Arquitectura excluida .

    Ingrese la descripción de la imagen aquí

O

  • Si está utilizando XCConfigarchivos 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 ejecute pod install.

    post_install do |installer|
      installer.pods_project.build_configurations.each do |config|
        config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
      end
    end
    
Amit Samant avatar Sep 18 '2020 11:09 Amit Samant

TL;DR;

Establezca "Construir solo arquitectura activa ( ONLY_ACTIVE_ARCH)" en 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.

  1. 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 .

  2. 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*).

  3. xcodebuild, en el sistema de compilación Xcode 12+ se considera arm64una 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 con arm64simuladores basados. Entonces envía clang(++)algún indicador -target como arm64-apple-ios13.0-simulatoren 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.

  4. Pero xcodebuildintenta esto solo para versiones de lanzamiento . ¿Por qué? Porque, ONLY_ACTIVE_ARCHla 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 que xcodebuildintentará 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á ambos x86_64y arm64de ahora en adelante, ya que arm64en 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 en sus bibliotecas/aplicaciones, incluso para el modo de lanzamiento.

Ingrese la descripción de la imagen aquí

Ingrese la descripción de la imagen aquí

Si las bibliotecas están incluidas como Pods y tienes acceso a ellas, .podspecsimplemente 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.

Ayan Sengupta avatar Sep 30 '2020 14:09 Ayan Sengupta

¡Encontré una solución! Las vistas previas de SwiftUI no funcionan con Firebase

Si configura arquitecturas excluidas para el simulador en arm64, se compilará.

Excluyendo arquitecturas para el simulador.

SlashDevSlashGnoll avatar Aug 27 '2020 18:08 SlashDevSlashGnoll