Symboles non définis pour l'architecture armv7

307

Ce problème me rend fou et je ne peux pas trouver de solution ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Je pense que cela a à voir avec:

ld: symbol(s) not found for architecture armv7

Mais j'ai ajouté: libz.1.2.3.dylibet ça n'aide pas, quelqu'un a des idées?

Alex Trott
la source
Une autre possibilité non couverte dans aucune des réponses existantes est que vous utilisez peut-être l' -ObjCautre indicateur de l'éditeur de liens et que les Obj-C des bibliothèques statiques externes que vous utilisez et qui ne devraient pas être visibles (comme celles de Parse) sont visibles. Voir ma réponse si c'est le cas: stackoverflow.com/a/26151208/901641
ArtOfWarfare
2
En règle générale, XCode donne parfois le type d'erreurs comme Match-O et le symbole introuvable pour l'architecture i386 (ou autre) lorsque des fichiers n'ont pas été ajoutés au projet. Vous pouvez faire un clic droit sur le dossier du projet et faire "Ajouter un fichier au <projet>".
Fabricio PH
Vous pouvez réellement voir les symboles concrets générés à l'aide de l'outil nm. Connectez-vous au chemin des fichiers .o et exécutez nm -gle fichier qui appelle le symbole et celui qui devrait avoir le symbole, et vous devriez voir s'ils correspondent ou non, ce qui peut fournir des indices pour l'erreur. nm -g file.o Vous pouvez inspecter les symboles C ++ démangés avec ceci: nm -gC file.o
james_alvarez
Quelqu'un ici peut-il m'aider? J'obtiens l'erreur ci-dessous mais aucune des solutions ci-dessus ne fonctionne pour moi. J'ai déjà passé des jours avec tous les paramètres possibles. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
red-devil

Réponses:

506

Causes communes

Les causes courantes des «symboles non définis pour l'architecture armv7» sont:

  1. Vous importez un en-tête et ne liez pas avec la bibliothèque correcte . Ceci est courant, en particulier pour les en-têtes de bibliothèques comme QuartzCore car il n'est pas inclus dans les projets par défaut. Résoudre:

    • Ajoutez les bibliothèques correctes dans la Link Binary With Librariessection du Build Phases.

    • Si vous souhaitez ajouter une bibliothèque en dehors du chemin de recherche par défaut, vous pouvez inclure le chemin dans la Library Search Pathsvaleur dans les paramètres de construction et l'ajouter
      -l{library_name_without_lib_and_suffix}(par exemple pour libz.a use -lz) à la Other Linker Flagssection de Build Settings.

  2. Vous copiez des fichiers dans votre projet mais avez oublié de vérifier la cible à laquelle ajouter les fichiers . Résoudre:

    • Ouvrez le Build Phasespour la bonne cible, développez Compile Sourceset ajoutez les .mfichiers manquants . Si tel est votre problème, veuillez également noter la réponse de Cortex ci-dessous .

  3. Vous incluez une bibliothèque statique conçue pour une autre architecture comme i386, le simulateur sur votre machine hôte. Résoudre:

    • Si vous avez plusieurs fichiers de bibliothèque de votre fournisseur de bibliothèques à inclure dans le projet, vous devez inclure celui du simulateur (i386) et celui du périphérique (armv7 par exemple).

    • En option, vous pouvez créer une grosse bibliothèque statique contenant les deux architectures.



Réponse originale:

Vous n'êtes pas lié au bon fichier libz. Si vous cliquez avec le bouton droit sur le fichier et révèle dans le Finder que son chemin doit être quelque part dans un dossier sdk iOS. Voici le mien par exemple

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Je recommande de supprimer la référence, puis de la rajouter à nouveau dans la section Lier le binaire aux bibliothèques, créer des phases de votre cible.

Joe
la source
4
Cela peut également être dû au fait que vous devez ajouter le mot "-licucore" dans les paramètres du projet / Autres indicateurs de l'éditeur de liens. Il a été ajouté automatiquement pour ma version de débogage, mais pas pour la version, donc je ne compilerais pas.
JulianB
4
J'ai eu le même problème. Je n'ai pas vraiment lu correctement les notes d'installation, je n'avais donc pas remarqué que la nouvelle version de bugsense avait besoin de libz binary ajouté dans les phases de construction.
Max MacLeod
2
Êtes-vous sûr d'avoir inclus une section @implementation dans votre fichier .m respectif pour toutes les classes que vous avez déclarées dans votre fichier d'en-tête?
slcott
7
Je veux juste ajouter que je pense qu'il était très respectueux de votre part de mentionner une autre réponse à cette question et de nous dire de voter si cela a aidé.
Andrew
Merci pour l'aide! :) Pour m'a aidé à taper explicitement dans Autres Linker section Drapeaux: -framework <FrameWorkName>. J'ai eu un problème avec XCTest, j'ai donc dû ajouter -framework XCTest. Merci! :)
piotr_ch
198

J'ai eu un problème similaire hier soir et le problème était lié au fait que j'avais fait glisser une classe du Finder vers mon projet dans Xcode.

La solution était d'aller dans l'onglet Build Phases puis dans Compile Sources et assurez-vous de faire glisser la classe dans la liste.

Cortex
la source
6
J'aimerais avoir réalisé que c'était la réponse que je cherchais plus tôt - Alternativement, vous pouvez vous assurer de cocher 'Ajouter aux cibles' lors de la copie des cours.
T. Markle
1
Whoa ... tellement content que la solution ait été aussi simple! Pour être clair, si vous ajoutez une classe en faisant glisser le Finder vers votre projet, XCode ne les ajoute pas toujours apparemment à votre liste de phases de construction. Je viens de cliquer sur le bouton "+" dans "Compiler les sources" sous les phases de construction, j'ai ajouté tous les fichiers incriminés et il a été compilé immédiatement.
Amos
1
Sensationnel. Apple a vraiment besoin de reconsidérer ses messages d'erreur.
devios1
2
Une autre façon de résoudre ce problème est de sélectionner le fichier qui serait manquant. et ouvrez la barre coulissante "Utilitaires". (C'est l'extrême droite) Et choisissez le "File Inspector". Assurez-vous ensuite qu'il y a une vérification dans le projet sous "Adhésion cible". J'utilise Xcode 4.6.2
zingle-dingle
1
Je ne savais pas quel fichier manquait, j'ai donc montré les phases de construction dans l'éditeur d'assistant (la deuxième vue d'édition). J'ai ouvert le fichier incriminé dans la vue d'édition de gauche et vérifié que chacun des fichiers importés existait dans les phases de construction. J'ai ajouté celui qui ne l'a pas fait et il a été résolu.
Dan Sandland
38

J'ai eu un problème similaire et j'ai dû vérifier "Build Active Architecture Only" sur chacune des configurations de projet (débogage, version et déploiement) et dans les paramètres de build de la cible.

Alex Zavatone
la source
3
A également fait l'affaire pour moi. C'était juste nécessaire dans le projet principal.
Kirualex
4
Je rencontre les mêmes problèmes. Les Build Active Architecture Onlyparamètres sont différents entre Podset mon projet. Au stade du lien, il a échoué.
AechoLiu
14

J'ai eu un problème similaire avec ça. Le nom de classe après _OBJC_CLASS _ $ _ était en fait ma classe. La raison en était que je n'ai pas coché "Ajouter à la cible" lorsque je fais glisser les fichiers de code source dans la liste de navigation.

Ma solution était:

  1. supprimez la classe de la liste de navigation et choisissez «supprimer la référence uniquement»

  2. faites à nouveau glisser les fichiers de code source et assurez-vous que la case à cocher «ajouter à la cible» est cochée. La case à cocher est juste sous "Copier si nécessaire" et "Créer un groupe".

syoleen
la source
Juste pour ajouter: bien que ce ne soit PAS LA CAUSE LA PLUS COURANTE de l'erreur, je viens de vous répondre (je n'ai pas coché la case) maintenant.
Adam
8

Il existe généralement un alias sans identifiant de version qui est lié à la version actuelle, dans ce cas, libz.dylib est lié à libz.1.2.5.dylib. Utilisez l'alias de base au lieu de l'alias versionné.

zaph
la source
5

Sous Cible -> Paramètres de construction -> Langue du compilateur Apple LLVM: la définition de 'C ++ Language Dialect' et 'C ++ Standard Library' sur Compiler par défaut a aidé à le résoudre.

user1368045
la source
5

J'ai seulement ajouté le libz.1.2.5.dylib à mon projet et cela a fonctionné comme un charme.

Étapes -

  1. Allez dans Build Phases.
  2. Lier le binaire à la bibliothèque - utilisez le bouton '+' pour choisir les cadres et les bibliothèques à ajouter.
  3. Sélectionnez libz.1.2.5.dylib dans la liste.
  4. Construisez et exécutez.
girish_vr
la source
5

J'ai eu un problème similaire et j'ai vu des erreurs liées à "std ::"

J'ai changé les paramètres de construction -> Apple LVM 5.0 - Langage C ++ -> Bibliothèque standard C ++

de libc ++ (bibliothèque standard LLVM C ++ avec prise en charge de C ++ 11) à libstdc ++ (bibliothèque standard GNU C ++)

Andrew Soltan
la source
5

J'ai eu le même problème lorsque j'utilise la bibliothèque admob, je l'ai corrigé en changeant "Architectures" en "Architectures standard armv7, armv7s" sans inclure 64 bits. Paramètres de construction

pabloverd
la source
4

J'ai plusieurs @interfaces dans le fichier .h et je n'avais pas encore inclus toutes les directives @implementation correspondantes. Assurez-vous qu'ils sont tous équilibrés.

James
la source
4

Si vous avez l'indicateur -ObjCsous votre cible> Paramètres de construction> Autres indicateurs de l' éditeur de liens et que vous rencontrez ce problème, envisagez de le supprimer. Si vous l'avez ajouté intentionnellement parce que vous devez charger du code Obj-C à partir d'une bibliothèque statique qui ne serait normalement pas chargée autrement, IE, une catégorie Obj-C, alors vous devriez utiliser à la -force_load <path>place de -ObjC.

<path>doit être relatif à votre répertoire de projet Xcode. IE, si la structure de votre répertoire ressemble à ceci:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Ensuite, vous devriez avoir ce drapeau défini pour Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Si vous souhaitez inclure plusieurs bibliothèques comme celle-ci, vous devez inclure une -force_loadligne distincte pour chacune d'entre elles.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
ArtOfWarfare
la source
4

Voici comment j'ai eu ce problème:

J'ai ajouté un .h, .m et un NIB d'un autre projet en les faisant glisser sur mon navigateur de projet. Xcode ne les a pas ajoutés correctement aux phases de construction.

Vérifiez ma réponse parce que j'avais un problème similaire que j'ai pu résoudre en faisant quelques étapes.

Himanshu Agnihotri
la source
3

si vous avez affaire à la mise à niveau iOS5, j'ai constaté que pour compiler un projet écrit sur la cible 4.3, je pouvais simplement renommer libz.1.2.3.dynlib dans le navigateur de projet en libz.1.2.5.dynlib et il a été compilé.

Mon dossier iPhoneOS50SDK / usr / lib n'a pas de libz.1.2.3.dynlib - je ne sais pas s'il s'agit d'une version bêta ou simplement d'une mise à niveau naturelle.

Stan
la source
3

Accédez à votre projet, cliquez sur Construire les phases, Compiler les sources, Ajouter GameCenterManager.m à la liste.

Dhaval Sarvaiya
la source
3

Certaines classes manquent probablement à votre cible. Cela se produit généralement lorsque vous renommez / supprimez / ajoutez de nouveaux fichiers de classes à votre projet. Pour corriger, ajoutez les classes nouvellement ajoutées à certaines cibles.

Sélectionnez la classe dans le Navigateur du projet (barre latérale droite), ouvrez la barre latérale Utilitaires (barre latérale droite), dans les Utilitaires sélectionnez l'inspecteur de fichiers (icône de type fichier), sous l'onglet Appartenance à la cible, cochez vos cibles. Tout cela pour éviter le "Supprimer la référence" et ajouter à nouveau en cochant l'astuce "Ajouter aux cibles".

Donc: Sélectionnez Classe -> Utilitaires (inspecteur de fichiers) -> Appartenance cible -> Cochez les cibles que vous souhaitez.

andrei
la source
2

Je n'ai pas trouvé cette suggestion ici, alors ça y va: si votre projet a plus d'une cible (c'est-à-dire une pour OSX et une pour iOS), vous devez lier les bibliothèques pertinentes pour chaque cible .. donc par exemple dans mon cas, je AudioToolbox nécessaire .. J'ai dû l'ajouter une fois pour OSX et une fois pour iOS (sous le dossier frameworks , vous devez avoir un double de chaque bibliothèque pour chaque cible .. si vous n'en voyez qu'une .. alors c'est un drapeau rouge)

abbood
la source
Cette réponse m'a aidé. Cependant, ma situation était encore plus simple ... J'ai simplement oublié d'ajouter un cadre référencé par ma base de code. Dans mon cas, je n'ai pas réussi à charger AVFoundation.framework.
John Erck
Oui, j'ai simplement oublié d'ajouter un framework dans la phase "Link Binary with Libraries".
Max
2

J'étais confronté à un problème avec les bibliothèques PJSIP,

J'ai essayé ce qui suit dans d'autres indicateurs de l'éditeur de liens dans le projet et capable de résoudre l'erreur: -framework Foundation -framework UIKit

Les drapeaux de l'éditeur de liens ci-dessus sont utilisés dans Siphone Project sur github . Ces paramètres vous aideront à résoudre les problèmes liés à la liaison des bibliothèques C ++.

Adeesh Jain
la source
J'ai le même problème avec les librabries PJSIP, pouvez-vous expliquer la solution en détail
Rajat Jain
Définissez les valeurs suivantes dans d'autres indicateurs de l'éditeur de liens du paramètre de génération de projet: -framework Foundation -framework UIKit
Adeesh Jain
Message d'erreur: en ignorant le fichier /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, le fichier a été créé pour l'archive qui n'est pas l'architecture liée (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Symboles non définis pour l'architecture i386: "_pjsip_register_method", référencé de:
Rajat Jain
Il semble que vous essayiez d'exécuter l'application sur le simulateur et que libyuv.a n'est pas conçu pour l'architecture du simulateur i386. essayez d'exécuter l'application directement sur l'appareil
Adeesh Jain
Je veux intégrer Pjsip dans Swift. J'ai essayé de créer des en-têtes de pontage, mais cela n'a pas fonctionné. Pouvez-vous me donner une idée?
Rajat Jain
1

Enfin, je l'ai compris, j'ai résolu ce problème en ajoutant un cadre absent à la cible-> Phases de construction-> Lier le binaire aux bibliothèques

lomec
la source
1

J'ai eu ce problème une fois. J'ai réalisé qu'en déplaçant une classe, j'avais écrasé le .mmfichier avec.h fichier sur le dossier de destination.

La résolution de ce problème a corrigé l'erreur.

user2158690
la source
1

J'ai reçu l'erreur «Symboles non définis pour l'architecture armv7:» lors de la tentative de compilation d'un projet dont le paramètre de génération cible pour «Bibliothèque standard C ++» était défini sur «libc ++» (nécessaire car le projet utilisait certaines fonctionnalités de C ++ 11), et le projet comprenait un sous-projet dont le même paramètre était défini sur «libstdc ++» (ou par défaut du compilateur tel qu'il est actuellement).

La modification du paramètre «Bibliothèque standard C ++» du sous-projet en libc ++ l'a corrigé, mais uniquement après avoir défini la cible de déploiement du sous-projet sur 5.0 ou supérieur (5.0 est nécessaire pour libc ++).

Si.
la source
1

Je vous donne plus de suggestions que vous pouvez vérifier lorsque d'autres suggestions courantes ne sont pas utiles.

Si vous établissez un lien avec un autre projet (libxxx.a), vous pouvez parfois rencontrer un problème étrange: vous pouvez trouver le symbole avec des outils comme nm, mais ils ne peuvent tout simplement pas trouver les symboles dans ld. Ensuite, vous devez vérifier si les deux projets sont construits dans les mêmes drapeaux, certains d'entre eux peuvent affecter le format binaire.

  1. vérifier le compilateur c ++.
  2. vérifiez les paramètres du dialecte c ++.
  3. vérifiez la prise en charge du type d'exécution c ++. (-frtti / -fnortti)
  4. vérifier s'il y a .a avec le même nom apparaît ailleurs, pourrait être au-delà du fichier voulu dans la liste des chemins de liens. retirez-les.
patte
la source
1

J'ai eu ce problème lorsque j'ai exécuté l'application sur iphone5s , il a été résolu en ajoutant arm64 aux architectures .

alexqinbj
la source
1

J'ai eu le même problème. J'ai tout essayé à partir de l'énorme liste de réponses mais à la fin mon problème était: je travaille avec openCV donc j'ai besoin de combiner du code C ++ dans mon code. Pour ce faire, vous devez changer les fichiers qui utilisent objective-c et C ++ en .mm Je n'ai pas changé un fichier et ce fichier n'a pas de connexion au code C ++ mais j'ai dû le changer.

user2743760
la source
1

J'ai eu ce problème lors de l'installation de shareKit. Cela a fonctionné dans le simulateur, mais pas sur l'appareil. J'ai supprimé -all_load de l' autre drapeau de l'éditeur de liens et tout fonctionne bien dans le simulateur et le périphérique iphone.

Jordan
la source
1

Dans mon cas, j'avais ajouté un framework qui doit utiliser Objective C ++. J'ai trouvé ce post:

XCode .m contre .mm

cela expliquait comment le main.m devait être renommé en main.mm pour que les classes Objective-C ++ puissent aussi être compilées.

Cela m'a arrangé.

Vito Andolini
la source
1

J'utilise pour faire face à ce problème lorsque le module (fichier .m) n'est pas dans la cible avec laquelle je travaille.

Javier Calatrava Llavería
la source
1

Pour moi, le problème était que j'oublie de définir la valeur de mes constantes dans le .m (implémentation)

file const kFooKey = @"Foo";
Jakub Truhlář
la source
1

J'ai également ajouté des fichiers par glisser-déposer. Ce que j'ai fait, j'ai supprimé les références de tous les fichiers (à l'exclusion frameworks) puis les ai rajoutés correctement via l' option Ajouter des fichiers au projet , problème disparu.

Vaibhav Saran
la source
1

Si vous construisez à partir d'Unity3D 5 et utilisez également un plugin Prime31 et que vous obtenez cette erreur, cela est probablement dû à un fichier .dll en double. Si vous regardez vos avertissements dans l'éditeur d'Unity, l'un d'eux vous le dira et vous avertira que cela pourrait provoquer des erreurs de construction. Pour voir si c'est le cas, tapez P31 dans le champ de recherche de votre projet et il devrait apparaître, peut-être même plus d'un. Les doublons auront un «1» à la fin du nom de fichier. Cela est probablement dû à la mise à jour du plugin dans l'éditeur via la boutique ou l'onglet de menu Prime31.

Dela Torre
la source