Symboles non définis pour l'architecture arm64

200

J'obtiens une erreur Apple Mach-O Linker à chaque fois que j'importe un fichier de CocoaPods.

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_FBSession", referenced from: someFile
ld: symbol(s) not found for architecture arm64

J'en reçois environ 12 pour les différents pods que j'utilise.

J'essaie de construire pour l'iPhone 5S en utilisant XCode 5.

J'ai essayé différentes solutions ici sur SO, mais je n'ai pas encore trouvé de solution qui fonctionne.

Comment puis-je corriger cette erreur de liaison Apple Mach-O?


Je viens de trouver un autre avertissement qui pourrait être intéressant, j'espère que cela me mènera à la solution:

Ignoring file ~/Library/Developer/Xcode/DerivedData/SomeApp/Build/Products/Debug-iphoneos/libPods.a, 

file was built for archive which is not the architecture being linked (arm64):~/Library/Developer/Xcode/DerivedData/someApp/Build/Products/Debug-iphoneos/libPods.a

GangstaGraham
la source
Solution simple Allez dans Cible -> Liaison -> autre indicateur de l'éditeur de liens et ajoutez $ (hérité) dans un autre indicateur de l'éditeur de liens dans Debug et Release.
Mihir Oza

Réponses:

248

Si vos architectures et architectures valides sont correctes, vous pouvez vérifier si vous avez ajouté $(inherited), qui ajoutera des indicateurs de l'éditeur de liens générés dans les pods, à d' autres indicateurs de l'éditeur de liens comme ci-dessous: entrez la description de l'image ici

chancyWu
la source
7
@chancyWu Pourriez-vous expliquer?
Paul Brewczynski
5
aussi, si cela ne fonctionne toujours pas, ajoutez @ (hérité) aux chemins de recherche de bibliothèque aussi.
Enrico Susatyo
1
Lol, Use the $(inherited) flagavertissement terminal ignoré . Et l'erreur m'a amené ici. sauvé ma journée.
Sushil Sharma
2
Je travaille avec Xcode 7.2 et dans d'autres indicateurs de l'éditeur de liens -> Débogage que je vois: -weak_framework CoreFoundation -weak_framework UIKit -weak_framework AVFoundation -weak_framework CoreMedia -weak-lSystem -ObjC ... ici j'ai ajouté $ (hérité) mais ça ne marche pas '' t work
Alessandra
Vous m'avez fait gagner beaucoup de temps. Merci.
Nirmalsinh
123

Le problème est que les cocoapods n'ont pas été construits pour l'architecture arm64 et qu'ils ne peuvent donc pas être liés lorsque vous les construisez. Vous ne pouvez probablement pas utiliser ces packages tant qu'ils ne sont pas mis à jour et n'utilisent pas cette architecture. Vous pouvez corriger l'erreur de l'éditeur de liens en accédant à project -> target (votre nom de projet) -> build settings and change architectures to standard architectures (armv7, armv7s), and valid architectures to armv7, armv7s.

Cependant, cela signifie que vous n'obtiendrez pas la pleine puissance du processeur 64 bits. Vous avez dit que vous construisez pour les 5, donc il peut y avoir une raison pour laquelle vous en avez besoin. Si, pour une raison quelconque, vous avez absolument besoin de ce pouvoir (peut-être que vous construisez un jeu) et que vous avez désespérément besoin de ces fichiers, vous pouvez soumettre une demande d'extraction, puis recompiler le projet en arm64 en définissant ces mêmes champs sur arm64 dans les fichiers à partir desquels vous avez extrait les projets open source. Mais, à moins que vous n'ayez vraiment besoin que ces fichiers soient compatibles 64 bits, cela semble un peu exagéré pour l'instant.

EDIT: Certaines personnes ont également signalé que la définition de Build For Active Architectures sur YES était également nécessaire pour résoudre ce problème.

Depuis le 28/04/2014, le paramètre devrait ressembler à ceci:

entrez la description de l'image ici

AdamG
la source
4
Cela a résolu l'erreur, pour l'exécution sur le simulateur, cependant, cela n'a pas résolu l'erreur pour l'exécution sur l'appareil. Pods a été rejeté pour libPods.a parce que ses architectures '' (pour une raison quelconque, il ne le détecte pas - bien que je puisse le voir dans Xcode) ne contenait pas toutes les architectures requises 'armv7 armv7s'
GangstaGraham
7
Ok, j'ai obtenu cela en définissant Build For Active Architectures sur Yes. Merci beaucoup!
GangstaGraham
2
Outre: vous pouvez utiliser la filecommande dans Terminal pour indiquer les architectures prises en charge par une bibliothèque statique.
funroll
8
Je suis juste venu ici pour ajouter au refrain: sélectionner OUI pour CONSTRUIRE POUR DES ARCHITECTURES ACTIVES est la meilleure option ici.
Wells
56
Ce n'est plus une solution. Apple exige désormais la prise en charge de 64 bits pour tous les déploiements.
52

J'ai résolu ce problème en définissant cela:

ARCHS = armv7 armv7s

VALID_ARCHS = armv6 armv7 armv7s arm64

morisunshine
la source
1
J'ai eu un problème similaire lors de la première utilisation de XCode 5.1, cela l'a corrigé. Merci!
GangstaGraham
@morisunshine êtes-vous sûr, avez-vous vérifié les architectures binaires après la construction?
onmyway133
@ onmyway133 J'ai vérifié, mais maintenant je n'ai pas rencontré ce problème dans le nouveau XCode.
morisunshine
@morisunshine ouais, je veux dire que vous perdez l'arm64
onmyway133
Plus d'erreurs de construction, jusqu'à présent, c'est OK. Mais lors du téléchargement de la construction archivée, j'obtiens une erreur manquante sur arm64, car la prise en charge d'arm64 bit est une contrainte à partir du 1er février 2015.
zeeawan
45

J'ai rencontré le même problème / la mise en œuvre similaire AVPictureInPictureControlleret le problème était que je ne liais pas le cadre AVKit dans mon projet.

Le message d'erreur était:

Undefined symbols for architecture armv7:
   "_OBJC_CLASS_$_AVPictureInPictureController", referenced from:
       objc-class-ref in yourTarget.a(yourObject.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

La solution:

  1. Accédez à votre projet
  2. Sélectionnez votre cible
  3. Ensuite, allez dans Build Phases
  4. Open Link binaire avec des bibliothèques
  5. Enfin, il suffit d'ajouter + le framework AVKit / tout autre framework .

J'espère que cela aide quelqu'un d'autre à rencontrer un problème similaire que j'ai eu.

valbu17
la source
6
Oui, il convient de mentionner qu'il s'agit d'une erreur qui se produit si vous manquez un cadre. Un indice est que vous essayez de supprimer des architectures et que la suivante / restante échoue aussi ...
Kristen Waite
1
bon travail. `" _OBJC_CLASS _ $ _ XXXXXClass ", référencé à partir de:` ,, add xxx Framework.
iHTCboy
Spot on! Quiconque voit quoi que ce soit avec 'xml' imprimé le vérifie - dans mon cas, le framework 'libxml' n'est pas lié.
Evusas
Après avoir modifié l'introduction de pod, cette erreur s'est produite et toutes les méthodes n'ont pas été corrigées. Mais votre méthode résout le problème. Remarque: lib ne peut pas être recherché.
Lee stellaire
33

J'ai également rencontré le même problème, les méthodes ci-dessus ne fonctionneront pas. J'ai accidentellement supprimé les fichiers dans le répertoire suivant.

Emplacement du dossier:

~ / Bibliothèque / Développeur / Xcode / DerivedData /

entrez la description de l'image ici

ylgwhyh
la source
3
Aussi étrange que cela puisse paraître, cela a réellement fonctionné. Merci mon pote.
Felipe
2
La suppression manuelle des données dérivées a également fait l'affaire pour moi. À votre santé!
L_Sonic
7
Je vous remercie! Je voudrais ajouter un indice: le dossier est sous / User / yourname / Library / Developer / XCode / DerivedData
Stefano Buora
Vous devriez également pouvoir supprimer les données dérivées à l'aide du terminal: rm -rf ~ / Library / Developer / Xcode / DerivedData
simon_smiley
J'ai économisé mon temps ... XDDD
Hsiao-Ting
25

Définissez les architectures sur armv7 armv7s , Build Active Architecture Only sur NO , pour chaque cible du projet, y compris chacun dans les pods

BabyPanda
la source
Sorta travaillé ... Maintenant, j'obtiens l'erreur "Signature de code bit invalide".
JeremyF
18

J'ai corrigé le mien en vérifiant les fichiers d'implémentation sélectionnés dans l'adhésion cible sur le côté droit. Ceci est particulièrement utile pour gérer les extensions, c'est-à-dire les claviers personnalisés.

Adhésion cible

jaytrixz
la source
Xcode 9 ne l'applique pas automatiquement, même si la case est cochée. Je vous remercie.
Amro Shafie
C'était ça le problème. Merci
Ignacio Hernández
11

Voici quelques explications build_active_architecture est NON. Xcode détecte désormais les appareils que vous avez connectés et définira l'architecture active en conséquence. Donc, si vous branchez un iPod Touch de 2e génération à votre ordinateur, Xcode devrait définir l'architecture active sur armv6. Construire votre cible avec la configuration de débogage ci-dessus ne construira désormais que le binaire armv6 pour gagner du temps (sauf si vous avez un projet énorme, vous ne remarquerez peut-être pas la différence, mais je suppose que les secondes s'accumulent avec le temps).

Lorsque vous créez une configuration de distribution pour la publication sur l'App Store, vous devez vous assurer que cette option n'est pas définie, afin que Xcode crée à la place le gros binaire universel http://useyourloaf.com/blog/2010/04/21/xcode -build-active-architecture-only.html

Moaz Saeed
la source
C'est incroyablement FUBARed! La sortie de XCode dépend de l'appareil que vous avez connecté à la machine de génération!
Matt
6

Vous devez simplement supprimer arm64 de l' architecture valide et définir NON sur l' architecture active uniquement . Maintenant, nettoyez, construisez et exécutez. Vous ne verrez plus cette erreur.

:) KP

Kalpesh Panchasara
la source
5

Résolu après la suppression du contenu de DerivedData -> Build -> Products -> Debug-iphoneos

Tamir Avrahamov
la source
4

Cela peut être lié à libz.dylibou libz.tbd, il suffit de l'ajouter à vos cibles pour les binaires de liaison et de réessayer de compiler.

TonyTony
la source
J'essayais d'ajouter le cadre Tesseract, et cela m'a aidé, merci. !
HelloimDarius
3

Je l'ai résolu en définissant des arches valides sur armv7 armv7s et en définissant des architectures actives uniquement sur YES dans la version, puis en effectuant une nouvelle "installation de pod" à partir de la ligne de commande

Fabio Russo
la source
3

Étant donné un iPhone 5s et n'ayant pas encore reçu une version 64 bits d'une bibliothèque tierce, j'ai dû revenir en mode 32 bits avec le dernier Xcode (avant 5.1, il ne se plaignait pas).

J'ai résolu ce problème en supprimant arm64 de la liste Architectures valides, puis en définissant Build Active Architecture Only sur NO. Il me semble que cela a plus de sens que l'inverse, comme indiqué ci-dessus. Je poste au cas où d'autres personnes ne pourraient obtenir aucune des solutions ci-dessus pour travailler pour eux.

user938797
la source
3

J'ai eu le même problème après la mise à niveau vers Xcode 5.1 et je l'ai résolu en définissant Architectures sur armv7 armv7s

deko
la source
3

Avait été coincé sur cette question toute la journée.

J'avais plusieurs schémas, il se compilait bien pour Demo, Internal, Release - mais le schéma de débogage ne voulait tout simplement pas compiler et se plaignait du manque de libPods.a.

La solution était d'aller dans le Projet -> Cible -> Paramètres de construction et de changer "Construire l'architecture active uniquement" sur OUI. Nettoyez et construisez! Enfin des heures de démangeaisons de la tête résolues!

Développement de jeu
la source
Pas exactement le même problème que vous, mais similaire. Je l'ai résolu avec la même méthode que vous avez fournie.
Helzgate
2

La définition -ObjCde Other Linker Flagsdans les paramètres de construction de la cible a résolu le problème.

Thomas G.
la source
2

Cela a fonctionné pour moi:

ios sdk 9.3

dans votre configuration de construction de l' architecture valide app.xcodeproj: armv7 armv7s Build Architecture active: Non

Nettoyer et construire, a fonctionné pour moi.

Shashank Saxena
la source
1

Ce qui suit a fonctionné pour moi pour que GPUImage se compile sans erreurs sur Xcode 5.1 pour le simulateur 64 bits et l'iPad Mini retina, sans avoir besoin de supprimer arm64 de la liste des architectures valides (ce qui va à l'encontre de l'objectif de posséder un appareil 64 bits pour les tests Performances 64 bits).

Téléchargez le dossier .zip depuis la page GitHub: https://github.com/BradLarson/GPUImage

Décompressez et accédez au dossier «framework». À partir de là, ajoutez et copiez le dossier «Source» dans votre projet Xcode. Assurez-vous que «Copier les éléments dans le dossier du groupe de destination» est coché et que «Créer des groupes pour tous les dossiers ajoutés» est également coché. Cela copiera les fichiers d'en-tête / d'implémentation génériques, iOS et Mac dans votre projet.

Si vous n'avez pas besoin des fichiers Mac parce que vous compilez pour iOS, vous pouvez supprimer le dossier Mac avant de copier les fichiers dans votre projet, ou simplement supprimer le groupe depuis Xcode.

Une fois que vous avez ajouté le dossier Source à votre projet, utilisez simplement ce qui suit pour commencer à utiliser les classes / méthodes de GPUImage:

#import "Source/GPUImage.h" 

Quelques points à souligner:

  • Si vous obtenez une erreur indiquant «Cocoa» introuvable, vous avez ajouté le dossier / en-têtes Mac dans votre projet iOS - supprimez simplement le groupe / les fichiers Mac de votre projet et l'avertissement disparaîtra
  • Si vous renommez le dossier Source (pas le groupe dans Xcode), utilisez ce nom au lieu de "Source / GPUImage.h" dans l'instruction #import. Donc, si vous renommez le dossier en GPUImageFiles avant d'ajouter à votre projet, utilisez: #import "GPUImageFiles / GPUImage.h
  • Assurez-vous bien sûr que arm64 est sélectionné dans la liste des architectures valides pour tirer parti du processeur A7 64 bits!
  • Ce n'est pas un bundle GPUImage.framework (comme si vous avez téléchargé le framework depuis http://www.raywenderlich.com/60968/ios-7-blur-effects-gpuimage ) donc ce n'est peut-être pas la bonne façon d'utiliser GPUImage que Brad Larson voulait, mais cela fonctionne pour mon projet SpriteKit actuel.
  • Il n'est pas nécessaire de créer un lien vers les frameworks / bibliothèques, etc. - il suffit d'importer l'en-tête et le dossier source d'implémentation comme décrit ci-dessus

J'espère que ce qui précède aide - il semble qu'il n'y ait pas d'instructions claires n'importe où malgré la question posée plusieurs fois, mais n'ayez crainte, GPUImage fonctionne certainement pour l'architecture arm64!

inaccessiblerail
la source
1

Ce problème s'est produit pour moi après l'installation d'un pod via Podfile et pod install. Après avoir essayé un tas de correctifs différents, j'ai finalement importé le pod manuellement (en faisant glisser les fichiers nécessaires dans mon projet) et cela a résolu le problème.

Will Dennis
la source
cela a fonctionné pour moi aussi, mais c'était un pod facile avec un fichier.
iluvatar_GR
1

Alors que la réponse de morisunshine pointait dans la bonne direction, un petit ajustement dans sa réponse a résolu mon problème pour iOS8.2. Merci à lui.

J'ai résolu ce problème en définissant cela:

ARCHS = armv7

VALID_ARCHS = armv6 armv7 armv7s arm64

BUILD ACTIVE ARCHITECTURE ONLY= NO
SandeepAggarwal
la source
1
  1. Accédez aux paramètres de build cibles.
  2. définissez BUILD ACTIVE ARCHITECTURE ONLY = NO pour le débogage et la version
  3. Construire et exécuter
Zia
la source
3
réglez BUILD ACTIVE ARCHITECTURE ONLY sur NO dans le projet PODS également!
Elad
1

Dans mon cas, je devais chercher

C++ Standard Libraryet assurez-vous que c'est bien celui qui a libc++été sélectionné.

Etienne Noël
la source
1

Pour moi, j'utilise opencv 2.4.9 dans xcode 7.2 pour iOS et les erreurs ci-dessus se sont produites, et je résous les erreurs en utilisant l'opencv via pod install plutôt que le framework opencv hors ligne.

Vous pouvez essayer en ajoutant le texte du pod opencv ci-dessous et supprimer le framework opencv hors ligne si vous l'avez utilisé.

pod 'OpenCV', '2.4.9'

Chuyang
la source
1

Aucune des solutions ne corrige cette erreur dans mon cas (Xcode 9), avec TesseractOCRiOS. Après des heures d'essais et d'erreurs, j'ai trouvé une bonne solution. Je viens de supprimer 'pod 'TesseractOCRiOS', '~> 4.0.0'dans le Podfile, exécutez pod install. Et puis, ajoutez à pod 'TesseractOCRiOS', '~> 4.0.0'nouveau Podfileet exécutez à pod installnouveau.

Coup! Ça marche!

Benjamin Wen
la source
1

"La cible OPN [Debug] remplace le paramètre de construction OTHER_LDFLAGS". C'était le principal problème. Après avoir ajouté $ (hérité) dans une nouvelle ligne dans d'autres indicateurs de l'éditeur de liens, j'ai résolu mon problème. entrez la description de l'image ici

Mohsen mokhtari
la source
1

dans certains cas, si vous définissez une interface de plus dans un fichier .h, mais n'avez pas implémenté toutes ces interfaces, cette erreur s'est produite.

L'éditeur de liens ne peut pas trouver l'implémentation dans le fichier .m, vous devez donc l'implémenter dans votre fichier .m pour chaque interface.

Pour résoudre cette erreur:

1. dans le fichier .m, fournissez l'implémentation pour chaque interface. 2. reconstruire

Michael Yang
la source
0

J'ai rencontré le même problème après avoir installé le cadre AWS pour surmonter ce problème, j'ai mis à jour le fichier de configuration POD de votre projet qui est créé après l'installation d'AWS POD. Vérifiez le fichier de configuration comme ci-dessous

OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-AWSAutoScaling" -l"
Pods-   AWSCloudWatch" -l"Pods-AWSCognito" -l"Pods-AWSCore" -l
"Pods-AWSDynamoDB" -l"Pods-AWSEC2" -l"Pods-AWSElasticLoadBalancing" 
-l"Pods-AWSKinesis" -l"Pods-AWSLambda" -l"Pods-AWSMachineLearning" 
-l"Pods-AWSS3" -l"Pods-AWSSES" -l"Pods-AWSSNS" -l"
Pods-AWSSQS"-l "Pods-AWSSimpleDB" -l"Pods-Bolts" -l"Pods-FMDB" 
-l"Pods-GZIP" -l"Pods-Mantle" -l"Pods-Reachability" -l"Pods-TMCache" 
-l"Pods-UICKeyChainStore" -l"Pods-XMLDictionary" -l"sqlite3" -l
"z"-framework "Accelerate" -framework "AssetsLibrary" 
-framework "CoreLocation" -framework "Foundation" -framework
"ImageIO" -framework "Security" -framework "SystemConfiguration"
-framework "UIKit" -weak_framework "UIKit"
 OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS)   

si votre fichier de configuration ne fonctionne pas correctement, définissez votre indicateur Other Linker sur $ (hérité)

Swapnil1156035
la source
0

Si les paramètres d'architecture et de l'éditeur de liens semblent bons, vérifiez vos fichiers h. Mon problème était la même erreur, mais j'avais restructuré les fichiers h et j'ai supprimé une instruction extern. D'autres fichiers m utilisaient cette variable, provoquant l'erreur de l'éditeur de liens.

pseudo
la source
0

L'ajout de "Security.framework" a fait l'affaire pour moi.

Eran Talmor
la source