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.dylib
et ça n'aide pas, quelqu'un a des idées?
-ObjC
autre 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/901641nm -g
le 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.oUndefined 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)
Réponses:
Causes communes
Les causes courantes des «symboles non définis pour l'architecture armv7» sont:
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 Libraries
section duBuild 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 Paths
valeur dans les paramètres de construction et l'ajouter-l{library_name_without_lib_and_suffix}
(par exemple pour libz.a use-lz
) à laOther Linker Flags
section deBuild Settings
.Vous copiez des fichiers dans votre projet mais avez oublié de vérifier la cible à laquelle ajouter les fichiers . Résoudre:
Build Phases
pour la bonne cible, développezCompile Sources
et ajoutez les.m
fichiers manquants . Si tel est votre problème, veuillez également noter la réponse de Cortex ci-dessous .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
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.
la source
-framework <FrameWorkName>
. J'ai eu un problème avec XCTest, j'ai donc dû ajouter-framework XCTest
. Merci! :)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.
la source
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.
la source
Build Active Architecture Only
paramètres sont différents entrePods
et mon projet. Au stade du lien, il a échoué.Une autre cause possible d'erreurs de l'éditeur de liens "symbole non défini" est d'essayer d'appeler une fonction C à partir d'un fichier .mm. Dans ce cas, vous devrez utiliser extern "C" {...} lorsque vous importez les fichiers d'en-tête.
Erreur de l'éditeur de liens lors de l'appel de la fonction C depuis Objective-C ++
la source
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:
supprimez la classe de la liste de navigation et choisissez «supprimer la référence uniquement»
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".
la source
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é.
la source
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.
la source
J'ai seulement ajouté le libz.1.2.5.dylib à mon projet et cela a fonctionné comme un charme.
Étapes -
la source
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 ++)
la source
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.
la source
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.
la source
Si vous avez l'indicateur
-ObjC
sous 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:Ensuite, vous devriez avoir ce drapeau défini pour
Other Linker Flags
:Si vous souhaitez inclure plusieurs bibliothèques comme celle-ci, vous devez inclure une
-force_load
ligne distincte pour chacune d'entre elles.la source
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.
la source
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.
la source
Accédez à votre projet, cliquez sur Construire les phases, Compiler les sources, Ajouter GameCenterManager.m à la liste.
la source
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.
la source
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)
la source
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 ++.
la source
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
la source
J'ai eu ce problème une fois. J'ai réalisé qu'en déplaçant une classe, j'avais écrasé le
.mm
fichier avec.h
fichier sur le dossier de destination.La résolution de ce problème a corrigé l'erreur.
la source
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 ++).
la source
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.
la source
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 .
la source
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.
la source
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.
la source
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é.
la source
J'utilise pour faire face à ce problème lorsque le module (fichier .m) n'est pas dans la cible avec laquelle je travaille.
la source
Pour moi, le problème était que j'oublie de définir la valeur de mes constantes dans le .m (implémentation)
la source
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.la source
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.
la source