239
votes

Xcode 12, construction pour iOS Simulator, mais liaison dans un fichier objet construit pour iOS, pour l'architecture arm64

Essayer d'obtenir un grand projet (et travaillant sur Xcode 11!) De construction dans Xcode 12 (bêta 5) pour préparer iOS 14. Codebase était auparavant Obj-C, mais contient maintenant à la fois Obj-C et Swift, et utilise des pods qui sont Obj-C et / ou Swift également.

J'ai tiré la nouvelle version bêta de cocoapods avec le support Xcode 12 (actuellement 1.10.0.beta 2).

L'installation du pod a réussi. Lorsque je fais une compilation, j'obtiens l'erreur suivante sur un framework de pod:

"construction pour iOS Simulator, mais liaison dans un fichier objet construit pour iOS, pour l'architecture arm64"

Quand je lance lipo -info sur le framework, il a: armv7s armv7 i386 x86_64 arm64.

Auparavant, le projet avait des architectures valides définies sur: armv7, armv7s et arm64.

Dans Xcode 12, ce paramètre disparaît, selon la documentation d'Apple. Architectures est défini sur $ (ARCHS_STANDARD). Je n'ai rien défini dans les architectures exclues.

Quelqu'un a-t-il une idée de ce qui peut se passer ici? Je n'ai pas encore pu reproduire cela avec un projet plus simple.


4 commentaires

J'obtiens la même chose sur une étape de lien de n'importe quel framework tiers qui est inclus manuellement dans le projet. Je suis curieux de savoir si vous trouvez une solution.


Avez-vous résolu ce problème entre-temps? (mi-septembre, toujours Xcode 12 beta 6)


Cela a fonctionné pour moi: stackoverflow.com/questions/24924809/...


Je suis en train de building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64 :( Comment y remédier?


31 Réponses :


66
votes

Trouvé une solution! https://developer.apple.com/forums/thread/657913

Si vous définissez les architectures exclues pour le simulateur sur arm64, il compilera.

à l'exclusion des architectures pour le simulateur


6 commentaires

Je ne pense pas que ce soit une solution. Cela crée un problème avec l'étape de post-build des cocoapodes avec le script qu'ils installent. Pods / Target Support Files / Pods-All-Apps-XXX / Pods-All-Apps-XXX-frameworks.sh: ligne 141: ARCHS [@]: variable non liée Il s'agit d'une méthode qui tente de supprimer les architectures invalides, donc il ne peut toujours pas terminer la construction. Même dans ce cas, l'exclusion d'arm64 est un correctif temporaire qui pourrait faire fonctionner la simulation, mais ne résoudra pas le problème de construction.


Assez juste, le problème que j'avais était avec une bibliothèque liée manuellement, mais cela n'a pas causé de problème avec nos pods que nous utilisons non plus.


Je testais en mode Release , donc j'ai dû l'ajouter à Release aussi


Je pense que nous sommes de retour dans les affaires après ce post. merci cela a aidé.


Cela fonctionne pour moi! Merci.


@btxios Je rencontre le problème "ARCHS [@]: unbound variable" lors de la création d'une archive. Avez-vous pu résoudre ce problème ?



6
votes

Je crois avoir trouvé la réponse. Selon les notes de publication de Xcode 12 beta 6:

" L'éditeur des paramètres de construction n'inclut plus le paramètre de construction des architectures valides (VALID_ARCHS) et son utilisation est déconseillée. À la place, il existe un nouveau paramètre de construction des architectures exclues (EXCLUDED_ARCHS). Si un projet inclut VALID_ARCHS, le paramètre est affiché dans le champ Utilisateur -Section définie de l'éditeur de paramètres de construction. (15145028) "

J'ai pu résoudre ce problème en éditant manuellement le fichier de projet (je ne pouvais pas comprendre comment supprimer l'élément du fichier de projet à l'aide de Xcode) et en supprimant toutes les lignes faisant référence à VALID_ARCHS. Après cela, je suis capable de construire pour le simulateur bien.


2 commentaires

En utilisant Xcode, VALID_ARCHS est dans sélectionnez Projet (pas Cible) puis `Paramètre de construction -> Défini par l'utilisateur". Sélectionnez-le et supprimez-le.


Cette solution a fonctionné pour moi. La solution suggérée par certains autres n'a pas fonctionné car le simple fait d'ajouter la valeur «arm64» au champ «Exclude Architecture» a commencé à donner une erreur «File Permission» pour le fichier .app généré.



42
votes

Xcode 12, bêta 6

Le paramètre de construction des architectures valides a été supprimé dans Xcode 12. Si vous aviez des valeurs dans ce paramètre de construction, elles causent un problème et doivent être supprimées.

J'ai pu "effacer" le paramètre de construction VALID_ARCHS en l'ajoutant de nouveau en tant que paramètre de construction défini par l'utilisateur (sans valeurs), en exécutant le projet (qui a échoué), puis en supprimant le paramètre de construction VALID_ARCHS. Après cela, j'ai pu courir sur le simulateur.

Le paramètre de construction de mes architectures est Architectures standard.

Vous pouvez ajouter un paramètre défini par l'utilisateur à partir du bouton plus dans les paramètres de construction:

Paramètre défini par l'utilisateur


12 commentaires

Cela devrait être la réponse acceptée. Assurez-vous que le projet d'application n'est pas sélectionné comme cible. Sinon, vous ne pourrez pas supprimer les VALID_ARCHS des paramètres de compilation. :)


@trishcode Même après avoir fait cela, j'obtiens la même erreur (xcode12 beta4), tout contournement


@SivakrishnaPerla Si vous pouvez ouvrir le projet dans Xcode 11, vous pouvez voir exactement sur quelles cibles les architectures valides sont utilisées. Vous pouvez même effacer le paramètre dans Xcode 11, puis réessayer le projet dans Xcode 12. Si vous avez toujours besoin d'une solution de contournement et que vous obtenez l'erreur sur un cadre intégré, la réponse de SlashDevSlashGnoll devrait fonctionner. Si vous avez besoin d'une solution de contournement et que vous obtenez l'erreur sur un Cocoapod, excluez l'architecture arm64 dans la post-installation de Podfile.


@trishcode Merci, la configuration de arm64 dans l'architecture exclue et la suppression de VALID_ARCHS ont fonctionné.


Si je supprime VALID_ARCHS et ajoute arm64 à l'architecture exclue, j'obtiens cette erreur - Vérifier les dépendances Aucune architecture à compiler pour (ARCHS = arm64 x86_64, VALID_ARCHS =, EXCLUDED_ARCHS = (arm64)).


@nOObiOS Je suppose qu'après avoir supprimé Valid Archs, vous avez essayé d'exécuter sans exclure arm64, et cela n'a pas fonctionné. Avez-vous des architectures standard ou d'autres architectures (en plus de arm64) dans le paramètre de construction Architectures?


Je n'ai pas cette propriété sur mon projet pour une raison quelconque.


@ JBarros35 Le paramètre VALID_ARCHS n'est pas affiché à partir du Xcode 12. Vous devez ajouter manuellement le paramètre VALID_ARCHS en tant que paramètre défini par l'utilisateur. J'ai inclus une capture d'écran de l'endroit où ajouter un paramètre de construction défini par l'utilisateur dans ma réponse.


@ JBarros35 Oui, vous devez ajouter manuellement le paramètre VALID_ARCHS, et vous NE DEVEZ PAS utiliser arm64 dans les architectures exclues. Les architectures exclues doivent être vides.


J'ai eu ce problème et j'ai poursuivi les autres solutions, mais je me suis retrouvé avec le même problème avec une autre architecture, i386, bien que les autres solutions n'aient pas aidé avec i386. Cette réponse a aidé à la fois!


J'ai eu ce problème; rechercher dans la base de code "VALID_ARCHS" dans un éditeur séparé et en supprimer toutes les instances était très simple et a résolu le problème pour moi.


J'ai dû supprimer l'entrée à la fois du projet et de la cible, en fait, cela a fonctionné.



8
votes

Après la mise à niveau vers Xcode 12, j'étais toujours en mesure de créer un appareil réel, mais pas le simulateur. La version Podfile ne fonctionnait que pour le vrai périphérique.

J'ai supprimé VALID_ARCHS sous Paramètres de construction> Définis par l'utilisateur et cela a fonctionné! Bashing ma tête pendant un certain temps avant de trouver cela.


0 commentaires

1
votes

Le problème ici sont les architectures valides dans Xcode 11, ouvrez le projet dans Xcode 11 et modifiez la valeur des architectures valides en $ (ARCHS_STANDARD) pour votre projet, cible et pods, rouvrez le projet dans Xcode 12 et construisez


0 commentaires

5
votes

Je résous le problème en ajoutant "arm64" dans "Architectures exclues" pour la cible du projet et la cible du pod.

Xcode -> Projet cible -> Paramètre de construction -> Architectures exclues> "arm64"

Xcode -> Pod Target -> Build Setting -> Excluded Architectures> "arm64"


0 commentaires

5
votes

Dans votre fichier podspec xxx.framework, ajoutez suivre la configuration éviter le paquet pod contient des arches similaires arm64

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }


6 commentaires

Ça a marché! Cependant, cela signifie que le Pod ne peut pas être utilisé dans les Mac basés sur Apple Silicon?


Est-ce confirmé @tomacco?


@FernandoReynoso Je viens de recevoir un kit de transition pour développeur, (ARM MacMini) testera et rapportera plus tard dans la journée


@tomacco Avez-vous pu le tester?


Si plusieurs spécifications de pod utilisent user_target_xcconfig et que les valeurs ne correspondent pas exactement, les CocoaPods émettront des avertissements comme celui-ci [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values. La référence de syntaxe podspec indique que cet attribut n'est "pas recommandé" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfi‌ g . Donc, veuillez ne pas utiliser user_target_xcconfig pour cela afin de sauver de nombreux développeurs.


Je pense que ce problème sera résolu plus tard par Cocoapods



387
votes

En gros, vous devez exclure arm64 pour l'architecture du simulateur à la fois de votre projet et du projet Pod,

  • Pour ce faire, accédez aux paramètres de construction de votre projet et ajoutez Any iOS Simulator SDK avec la valeur arm64 dans l' Excluded Architecture .

    entrez la description de l'image ici

OU

  • Si vous utilisez des fichiers XCConfig personnalisés, vous pouvez simplement ajouter cette ligne pour exclure l'architecture du simulateur.
post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

ensuite

Vous devez faire de même pour le projet Pod jusqu'à ce que tous les vendeurs de cabosses de cacao aient fini d'ajouter les éléments suivants dans leur Podspec .

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Vous pouvez ajouter manuellement l' Excluded Architechure dans les paramètres de construction de votre projet de pod, mais il sera écrasé lorsque vous utiliserez l' pod install .

À la place de cela, vous pouvez ajouter cet extrait dans votre Podfile . Il écrira les paramètres de construction nécessaires chaque fois que vous exécuterez l' pod install

EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64


24 commentaires

wow, mec! sauvé ma journée et peut-être la nuit! Merci pour une réponse aussi détaillée.


@DominatorVbN Donc, toutes les dépendances pour un Podspec doivent être exclues, non?


Merci beaucoup pour cette réponse, fait ma journée !!


Le détail supplémentaire sur les CocoaPods ici est agréable. Notez que sans [sdk=iphonesimulator*] après EXCLUDED_ARCHS , XCode ne parviendra pas à trouver vos pods lors de la construction pour un appareil réel car aucun des pods ne sera construit pour arm64.


@ChrisVanBuskirk Oui, toutes les dépendances et les sous-dépendances doivent être exclues, à partir de maintenant, de nombreux vendeurs de cocoapod sont déjà exculidés via Podspec, mais jusqu'à ce que tous aient terminé la migration, nous pouvons attacher ce petit extrait dans un fichier pod pour l'exclure lors de l'installation du pod.


Merci! A parfaitement fonctionné


Merci beaucoup! Cela m'a fait gagner beaucoup de temps à essayer de comprendre ce qui ne va pas.


Cela fonctionne dans l'appareil et obtient une erreur dans le simulateur.


A travaillé pour moi! Notez qu'il existe déjà un post_install do |installer| section dans la plupart des Podfiles en raison de flipper. Collez la section interne installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"‌​] = "arm64" end derrière la ligne flipper_post_install(installer) .


Je suis en train de building for iOS Simulator, but linking in object file built for macOS, for architecture x86_64 . Comment le réparer?


Cette solution est excellente et j'ajouterais que si vous construisez votre propre pod, prenez particulièrement note des 2 lignes que l'auteur suggère après "... jusqu'à ce que tous les vendeurs de cabosses de cacao aient fini d'ajouter dans leur Podspec" car l'absence de ces dans mon propre cadre, Podspec provoquait des échecs de peluchage lorsque j'ai tenté de le pousser vers mon dépôt privé. Merci!


@ user3335999 pourriez-vous partager l'erreur à laquelle vous faites face.


Remarque: vous devez répéter la première étape pour chaque programme que vous avez


La solution présente un défaut qui cause des problèmes puisque les auteurs de spécification de pod ont trouvé et appliqué cette solution. La partie problématique est l'utilisation de user_target_xcconfig . Puisque plusieurs spécifications de pod définissent des valeurs différentes pour EXCLUDED_ARCHS elles sont en conflit et CocoaPods émet des avertissements comme celui-ci [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values. La référence de syntaxe podspec indique que cet attribut n'est "pas recommandé" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfi‌ g


Je suggère de vérifier stackoverflow.com/a/64150387/2399348


Merci pour votre réponse! Pouvez-vous expliquer pourquoi cela est nécessaire?


@WojciechKulik stackoverflow.com/a/64139830/11857852 cette réponse explique joliment ce qui a été changé dans Xcode, notre simulateur fonctionne maintenant sur x86 mais le framework essaie également de construire pour arm64.


si mon podspec inclut des dépendances (par exemple ss.dependency 'Mantle', '2.1.4') comment exclure arm64 pour cette dépendance aussi? semble que si j'ajoute simplement s.pod_target_xcconfig = {'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64'} s.user_target_xcconfig = {'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64'} il ne le fait pas affecter les dépendances


Prenez mon Upvote monsieur. Le chapeau part pour vous aujourd'hui :)


Pourquoi ne détecte-t-il pas que l'architecture active n'est pas arm64?


Cela a fonctionné pour moi. J'avais plusieurs cibles. Architectures donc exclues ajoutées au "Projet", pas aux "Cibles"


Grande solution bro. A travaillé pour moi. Merci beaucoup!


si vous utilisez Apple silicon dtk pour exécuter le projet, avez le même problème, comment le résoudre? Appareil: DTK mac mini, version Xcode: 12.2 rc, exécutez le simulateur ios dont l'arc est arm 64. Erreur de lancement: construction pour le simulateur iOS, mais liaison dans le fichier objet construit pour iOS, pour l'architecture arm64


@jiaweiwang qu'en est-il de la solution ONLY_ACTIVE_ARCH que j'ai mentionnée ici: stackoverflow.com/a/64139830/2650641 ?



0
votes

Dans mon cas:

J'avais 4 configurations (+ DebugQa et ReleaseQa) Cocoapods est utilisé comme gestionnaire de dépendances

Pour le débogage, je me suis réuni sur l'appareil et dans le simulateur, et sur qa uniquement sur l'appareil.

Cela a aidé à définir BuildActiveArchitecture sur yes dans PodsProject


0 commentaires

0
votes

Dans mon cas, j'essayais de courir sur un simulateur watchOS 7 en mode Relese mais le simulateur iOS 14 était en mode Debug.

Donc, simplement mettre les deux sims en mode Debug / Release a résolu le problème pour moi!


0 commentaires

-3
votes

Pour que cela fonctionne pour les tests automatisés de Calabash

Il existe une demande d'extraction pour résoudre le problème de xcode 12 ne fonctionnant pas avec calebasse https://github.com/calabash/run_loop/pull/757

Une solution temporaire consiste à utiliser cette branche WIP, même si ce n'est pas génial de devoir l'utiliser car il s'agit d'un projet de PR. Nous espérons que la prise en charge de Xcode 12 pour Calabash viendra dans le futur.

Changement dans votre Gemfile

gem 'run_loop', git: 'https://github.com/calabash/run_loop.git', branch: 'xcode_14_support'

à

gem "run_loop"


0 commentaires

5
votes

Xcode 12

La suppression de VALID_ARCH des paramètres de construction sous le groupe défini par l' utilisateur fonctionne pour moi.

entrez la description de l'image ici


0 commentaires

10
votes

Si vous rencontrez des problèmes dans Xcode 12 avec des simulateurs, pas un appareil réel, oui, vous devez supprimer les paramètres VALID_ARCHS car ils ne sont plus pris en charge. Allez dans "builds settings", recherchez " VALID_ARCHS " et supprimez les propriétés définies par l'utilisateur. Faites-le dans chaque cible que vous avez.

Néanmoins, vous devrez peut-être ajouter un script au bas de votre fichier de pods pour que les pods se compilent avec la bonne architecture et la bonne cible de déploiement:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
     end
  end
end


1 commentaires

La suppression de VALID_ARCHS de mon projet a bien fonctionné. Je n'ai rien changé au podfile ni au projet pods.



3
votes

Pour les développeurs de pods Dans votre Podspec, ajoutez:

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

Puis dans votre exemple de projet Exemples de paramètres de fichiers de projet

Le voir fonctionner dans ce projet


1 commentaires

Si plusieurs spécifications de pod utilisent user_target_xcconfig et que les valeurs ne correspondent pas exactement, les CocoaPods émettront des avertissements comme celui-ci [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values. La référence de syntaxe podspec indique que cet attribut n'est "pas recommandé" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfi‌ g . Donc, veuillez ne pas utiliser user_target_xcconfig pour cela afin de sauver de nombreux développeurs.



1
votes

Dans mon cas: Xcode 12

Je mets des valeurs vides sur EXCLUDED_ARCHS et mis ONLY_ACTIVE_ARCH Debug = YES Relâchement = NO Build projet de réglage

et j'ai inclus ceci dans mon Podfile:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
    end
end

Il fonctionne sur mon simulateur iPhone 8 (iOS 12) et iPhone 11 Pro Max (iOS 14) et sur mon appareil iPhone 7 Plus (iOS 13.4)


0 commentaires

1
votes

Définissez le paramètre de "Build Active Architecture Only"(ONLY_ACTIVE_ARCH) sur yes, xcode demande arm64 à cause de l'architecture Silicon MAC qui est arm64.

arm64 a été ajouté en tant qu'arche de simulateur dans Xcode12 pour prendre en charge Silicon MAC.

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json


2 commentaires

S'il ne fonctionne pas sur silicium Mac, il devrait sûrement savoir ne pas utiliser arm64?


@Jonathan. Oui, cela aurait dû être fait comme ça, mais actuellement ce n'est pas le cas.



5
votes

Pour moi, le paramètre suivant a fonctionné:

Paramètres de construction >> Architectures exclues

"arm64" a été ajouté aux modes Release et Debug pour l'option "Any iOS Simulator SDK".

entrez la description de l'image ici


1 commentaires

Merci, cela a fonctionné



94
votes

TL, DR;

Définissez "Construire une architecture active uniquement ( ONLY_ACTIVE_ARCH )" sur Oui pour vos bibliothèques / applications, même pour le mode de publication .


En essayant d'identifier la cause première du problème, j'ai réalisé quelques faits amusants sur Xcode 12.

  1. Xcode 12 est en fait le tremplin pour Apple Silicon qui n'est malheureusement pas encore disponible. Mais avec cette plate-forme, nous allons obtenir un macOS basé sur arm64 où les simulateurs fonctionneront également sur l'architecture arm64 contrairement à l'architecture x86_64 actuelle basée sur Intel.

  2. Xcode dépend généralement de la «destination d'exécution» pour créer ses bibliothèques / applications. Ainsi, lorsqu'un simulateur est choisi comme «destination d'exécution», il crée l'application pour les architectures de simulateur disponibles et lorsqu'un appareil est choisi comme «destination d'exécution», il construit pour l'architecture prise en charge par l'appareil ( arm* ).

  3. xcodebuild , dans le système de construction Xcode 12+, considère arm64 comme une architecture valide pour le simulateur. Ainsi, lorsqu'un simulateur est choisi comme destination d'exécution, il peut potentiellement essayer de compiler / lier vos bibliothèques / applications avec des simulateurs basés sur arm64 (pas encore disponible). Donc, il envoie clang(++) un drapeau -target comme arm64-apple-ios13.0-simulator dans <architecture> - <os> - <sdk> - format <platform> et clang essaie de construire / lier un simulateur basé sur arm64 qui échoue finalement sur mac basé sur Intel.

  4. Mais xcodebuild essaie cela uniquement pour les versions Release . Pourquoi? Parce que, les paramètres de construction "Build Active Architecture Only ( ONLY_ACTIVE_ARCH )" sont généralement définis sur "No" pour la configuration "Release" uniquement. Et cela signifie que xcodebuild essaiera de créer toutes les variantes architecturales de vos bibliothèques / applications pour la destination d'exécution sélectionnée pour les versions de version. Et pour la destination d'exécution du simulateur, il inclura à la fois x86_64 et arm64 , car arm64 dans Xcode 12+ est également une architecture prise en charge pour les simulateurs arm64 en charge Apple Silicon.

En termes simples, Xcode ne parviendra pas à créer votre application à chaque fois qu'il essaiera la ligne de commande, xcodebuild , (qui par défaut pour release build, voir l'onglet général de votre paramètre de projet) ou autrement en mode release . Une solution simple à ce problème consiste donc à définir "Construire une architecture active uniquement ( ONLY_ACTIVE_ARCH )" sur Oui dans vos bibliothèques / applications, même en mode de publication.

entrez la description de l'image ici entrez la description de l'image ici

Si les bibliothèques sont incluses en tant que pods et que vous avez accès à .podspec vous pouvez simplement définir:

spec.pod_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'OUI'}

spec.user_target_xcconfig = {'ONLY_ACTIVE_ARCH' => 'OUI'} # non recommandé

Personnellement, je n'aime pas la deuxième ligne car les pods ne devraient pas polluer le projet cible et cela pourrait être remplacé dans les paramètres cibles eux-mêmes. Il devrait donc être de la responsabilité du projet consommateur de remplacer le paramètre par certains moyens. Cependant, cela pourrait être nécessaire pour réussir le peluchage des podspecs.

Cependant, si vous n'avez pas accès au .podspec , vous pouvez toujours mettre à jour les paramètres lors de l'installation des 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

Une chose qui m'inquiétait est de savoir quel sera l'impact de cela lorsque nous archiverons réellement les bibliothèques / applications. Lors de l'archivage, les applications prennent généralement la configuration "Release" et comme cela créera une version de version ne considérant que l'architecture active de la destination d'exécution actuelle, avec cette approche, nous pourrions perdre les tranches pour armv7, armv7s, etc. de la version cible. Cependant, j'ai remarqué que la documentation indique (mise en évidence dans l'image ci-jointe) que ce paramètre sera ignoré lorsque nous choisirons "Périphérique iOS générique / Tout périphérique" comme destination d'exécution, car il ne définit aucune architecture spécifique. Donc, je suppose que nous devrions être bons si nous archivons notre application en la choisissant comme destination d'exécution.


14 commentaires

C'est la première réponse qui a amélioré ma compréhension du problème, au lieu de simplement dire "changez ces trois paramètres de construction et peut-être que cela fonctionne". Merci pour le temps que vous avez consacré à la rédaction!


C'est vraiment un changement surprenant par rapport à Apple et cela m'a coûté une demi-journée pour comprendre que je pense qu'Apple devrait compenser :). Ce n'est pas une mise à jour documentée (du moins à ma connaissance) et va certainement affecter tout le monde qui passe à Xcode 12. J'espère seulement que tout le monde trouvera sa propre façon d'en finir une fois qu'il connaîtra les bases.


Si plusieurs spécifications de pod utilisent user_target_xcconfig et que les valeurs ne correspondent pas exactement, les CocoaPods émettront des avertissements comme celui-ci [!] Can't merge user_target_xcconfig for pod targets: [... list of pods ...]. Singular build setting EXCLUDED_ARCHS[sdk=<...>] has different values. La référence de syntaxe podspec indique que cet attribut n'est "pas recommandé" guides.cocoapods.org/syntax/podspec.html#user_target_xcconfi‌ g . Donc, veuillez ne pas utiliser user_target_xcconfig pour cela afin de sauver de nombreux développeurs.


Droite! Et je pense que je l'ai déjà mentionné dans ma réponse.


Je pense que c'est la meilleure solution car elle ne rompt pas la construction avec Xcode 11. J'ai appliqué ce paramètre pour l'ensemble du projet, puis je n'ai pas eu à le définir séparément pour les pods ou les cibles. Et cela fonctionne alors à la fois sur Xcode 11.7 et Xcode 12. Hors arch, arm64 est mappé dans Xcode 11.7 vers x86_64 donc il exclut l'architecture principale du simulateur.


Merci! J'ai eu tous mes problèmes résolus en utilisant stackoverflow.com/a/64150387/2399348 , ou c'est ce que je pensais. Aujourd'hui, en essayant de créer une version pour le simulateur, j'ai de nouveau eu des problèmes. Cette solution semble fonctionner en combinaison avec la réponse liée


Merci! Je n'ai pas encore compris si cela fonctionnera pour moi, mais quoi qu'il en soit, je vous ai voté pour avoir fourni une réponse détaillée et raisonnée!


@AirsourceLtd me fait savoir si vous pouvez trouver des failles que je dois introspecter. Franchement, je cherche moi-même désespérément une situation où ça va échouer et je devrai trouver un autre moyen de contourner.


J'ai réussi à tout faire fonctionner à la fin avec 'EXCLUDED_ARCHS [sdk = iphonesimulator *]' => 'arm64' mais uniquement dans pod_target_xcconfig, et uniquement sur le pod problème (qui comprenait une bibliothèque prédéfinie) et le pod unique qui dépendait de le module de problèmes. Tout le reste a été laissé propre. J'ai décidé que je préférais cela à la solution de l'arc actif.


La création de l'architecture active uniquement ne causerait-elle pas des problèmes avec les versions de version lors de la soumission App Store / TestFlight?


@ BalázsVincze Non, ce ne sera pas le cas. 1. La construction pour une architecture active uniquement lorsqu'une destination d'exécution spécifique est choisie (simulateur / iPhone / iPad) sera construite uniquement pour l'architecture active prise en charge par l'appareil. 2. Pour la destination d'exécution «Tout appareil iOS» (qui est utilisée pour l'archivage lors de la soumission) - «Ce paramètre sera ignoré lors de la création avec une destination d'exécution qui ne définit pas une architecture spécifique, telle qu'une destination d'exécution« Appareil générique » . ", selon la documentation. Veuillez lire le dernier paragraphe de ma réponse. J'ai personnellement soumis mes applications plusieurs fois avec ce paramètre activé.


L'ajout de l'extrait de code au Podfile, Clean and Build a fonctionné pour moi. Merci


Je suis sur Xcode 12.2 et toutes ces suggestions ne fonctionnent pas pour moi lors de la création d'une archive. Si j'ai besoin d'éditer le fichier de projet manuellement, quelqu'un peut-il me guider. Je suis bloqué dessus pendant quelques jours et je ne peux pas déployer mon application


@ArdenDev, vous pouvez publier une question distincte décrivant votre problème. Il est vraiment impossible de comprendre quoi que ce soit à partir de votre seul commentaire.



0
votes

Basculez la configuration de construction en mode débogage ou activez la création d'une architecture active uniquement pour les modes débogage et libération. La raison en est que votre bibliothèque / structure ne prend pas en charge la nouvelle architecture de simulateur ARM64 (exécutée sur Mac avec un processeur Apple Silicon)


0 commentaires

3
votes

J'avais des problèmes pour créer des frameworks à partir de la ligne de commande. Mon framework dépend d'autres frameworks qui n'avaient pas de support pour les simulateurs ARM. J'ai fini par exclure le support des simulateurs ARM jusqu'à ce que je mette à niveau mes dépendances.

J'avais besoin de l'indicateur EXCLUDED_ARCHS=arm64 lors de la construction du cadre pour les simulateurs à partir de la CLI.

xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64


1 commentaires

Pareil ici. Le "problème" clé dans ce scénario est en fait la construction pour une destination générique via -destination "generic/platform=iOS Simulator" . Cela conduit à construire pour toutes les architectures disponibles, ce qui inclut arm64 depuis Xcode 12.



1
votes

Sur Build Settings recherchez VALID_ARCH puis appuyez sur delete . Cela devrait fonctionner pour moi avec Xcode 12.0.1

VALID_ARCH sur les paramètres de compilation


1 commentaires

Je ne trouve pas VALID_ARCH , qu'est-ce que c'est?



0
votes

Ajoutez la ligne "arm64" (sans guillemets) au chemin: Xcode -> Projet -> Paramètres de construction -> Architectures -> Architectures exclues Faites également de même pour les pods. Dans les deux cas pour les champs de débogage et de version.

ou en détail ...

Les erreurs mentionnées ici lors du déploiement sur le simulateur à l'aide de Xcode 12 sont également l'une des choses qui m'ont affecté. Il suffit de faire un clic droit sur chacun de mes projets et de les afficher dans le Finder, d'ouvrir le .xcodeproj dans Atom, puis de parcourir le .pbxproj et de supprimer tous les paramètres VALIDARCHS. C'est ce qui a fait que ça marche pour moi. J'ai essayé quelques-unes des autres suggestions (à l'exception de arm64, Build Active Architecture Only) qui semblaient aller plus loin dans ma construction, mais me laissaient finalement sur une autre erreur. Avoir les paramètres VALIDARCH qui traînent est probablement la meilleure chose à vérifier en premier.


0 commentaires

3
votes

Après avoir essayé presque tous les articles de ce fil et lu les forums de développeurs Apple, j'ai trouvé qu'une seule solution fonctionnait pour moi.

Je construis un framework universel qui est utilisé dans une application rapide. Je n'ai pas pu construire sur le simulateur sans erreurs d'architecture.

Dans mon projet Framework, j'ai une tâche Universal Framework dans mes phases de construction, si c'est le cas pour vous

  • Ajoutez ce qui suit à votre tâche xcodebuild dans la phase de construction: EXCLUDED_ARCHS="arm64"

Ensuite, vous devez modifier les Build Settings projet suivants:

  • Supprimer le VALID_ARCHS défini par l'utilisateur VALID_ARCHS
  • Définissez ONLY_ACTIVE_ARCH sur YES ***

*** Si vous développez un framework et disposez également d'une application de démonstration, ce paramètre doit être activé dans les deux projets.


0 commentaires

1
votes

Ajoutez uniquement Any iOS Simulator SDK -> x86_64 aux Project's Build Settings -> VALID_ARCHS fonctionne pour moi.

Version Xcode: 12.1 (12A7403)

entrez la description de l'image ici

Si votre projet inclut des frameworks qui ne prennent pas en charge x86_64.

  • Vous pouvez ajouter ces noms de framework ( xxx.framework ) à Target -> Build Settings -> Excluded Source File Names -> Debug -> Any iOS Simulator SDK .
  • Et puis modifiez les Framework Search Paths pour supprimer les chemins de ces frameworks pour Debug -> Any iOS Simulator SDK .

Ces deux paramètres peuvent empêcher Xcode de créer et de lier ces frameworks en mode simulateur.

entrez la description de l'image ici

entrez la description de l'image ici


0 commentaires

3
votes

Mises à jour: octobre 2020

Vous pouvez simplement définir arm64 uniquement pour Debug > Simulator - iOS 14.O SDK sous Architecture exclue.

entrez la description de l'image ici


0 commentaires

0
votes

Partager la solution qui a fonctionné pour moi, qui peut aider quelqu'un

Problème lors de la compilation pour le simulateur:

construction pour iOS Simulator, mais liaison dans un fichier objet construit pour iOS, pour l'architecture arm64

post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
 end
end

Ma structure de projet

  • Cible principale
  • Partager l'extension
  • Extension du service de notification
  • Sous-module, cadre personnalisé
  • Podfile
  1. Ajoutez arm64 aux paramètres de construction -> Exclude Architecture dans toutes les cibles.

entrez la description de l'image ici

  1. Suppression de arm64 de VALID_ARCHS et ajout de x86_64 dans toutes les cibles.

entrez la description de l'image ici

  1. Ajouter le code suivant dans podfile

    XCODE 12.1, POD 1.9.1
    
  2. Avez-vous mis à pod update , supprimé podfile.lock et pod install

  3. Faites une construction propre.


0 commentaires

0
votes

Après avoir essayé beaucoup de réponses inutiles en ligne. Cela fonctionne pour moi.

Tout d'abord, génère x86_64 pour les projets Pod !!!!

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ARCHS'] = "arm64 x86_64"
        end
    end
end

Deuxièmement, ajoutez «x86_64» pour VALID_ARCHS

entrez la description de l'image ici


0 commentaires

0
votes

Cela a fonctionné pour moi lorsque j'ai défini $(ARCHS_STANDARD) pour VALID_ARCHS pour Debug for Any iOS Simulator SDK. J'ai également mis YES pour ONLY_ACTIVE_ARCH pour le débogage.

entrez la description de l'image ici


0 commentaires

1
votes

Je comprends le problème avec arm64 et Xcode 12 et j'ai pu résoudre les problèmes de construction en excluant l'architecture arm64 pour iPhone Simulator ou en définissant ONLY_ACTIVE_ARCH pour le schéma de version. Cependant, j'ai toujours des problèmes pour pousser mon framework à l'aide de pod repo push.

J'ai découvert que la configuration de s.pod_target_xcconfig dans mon podspec n'applique pas ce paramètre aux dépendances définies dans le même podspec. Je peux le voir dans le projet d'application factice que Cocoapods génère lors de la validation. La validation de Cocoapods exécute un schéma de version pour le simulateur et cela échoue lorsqu'une ou plusieurs dépendances n'exclut pas arm64 ou n'est pas définie pour créer une architecture active uniquement.

Une solution pourrait être de forcer les Cocoapods à ajouter un script de post-installation lors de la validation du projet ou de le laisser construire un schéma de débogage, car le schéma de débogage ne construit que l'architecture active.

J'ai fini par utiliser Xcode 11 pour libérer mon pod afin de passer la validation. Vous pouvez télécharger Xcode 11 à partir de developer.apple.com, le copier dans le dossier Applications en tant que Xcode11.app et basculer à l'aide de sudo xcode-select --switch /Applications/Xcode11.app/Contents/Developer . N'oubliez pas de revenir en arrière lorsque vous avez terminé.


0 commentaires

1
votes

J'étais également confronté au même problème avec une bibliothèque spécifique installée via Carthage. Pour ceux qui utilisent Carthage, comme Carthage ne fonctionne pas directement avec Xcode 12, ce document vous guidera à travers une solution de contournement qui fonctionne dans la plupart des cas. Eh bien, sous peu, Carthage construit de gros frameworks, ce qui signifie que le framework contient des binaires pour toutes les architectures prises en charge. Jusqu'à l'introduction d'Apple Sillicon, tout fonctionnait très bien, mais maintenant il y a un conflit car il y a des architectures en double (arm64 pour les appareils et arm64 pour le simulateur). Cela signifie que Carthage ne peut pas lier des frameworks spécifiques à une architecture à un seul framework fat.

Vous pouvez suivre les instructions ici. Carthage XCODE 12

Puis après avoir configuré le Carthage. Mettez l'arm64 dans les "Architectures exclues" sur les paramètres de construction. entrez la description de l'image ici

Essayez d'exécuter votre projet en utilisant un simulateur. Le simulateur doit fonctionner sans aucune erreur.


0 commentaires

0
votes

Après avoir exclu arm64, j'ai toujours ARCHS [@]: variable non liée. Pour moi, la seule solution était d'ajouter x86_64 au paramètre de construction cible comme mentionné ici Problèmes après la mise à niveau vers Xcode 12: ld: construction pour iOS Simulator, mais liaison dans dylib construit pour iOS, architecture arm64 Vous pouvez également supprimer le arm64 d'exclusion que vous avez ajouté avant.


0 commentaires