web-dev-qa-db-fra.com

Symboles non définis pour l'architecture armv7

Ce problème m'a rendu fou, et je ne peux pas résoudre le problème ...

    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?

300
Alex Trott

Causes communes

Les causes courantes de "Symboles non définis pour l'architecture armv7" sont les suivantes:

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

    • Ajoutez les bibliothèques correctes dans la section Link Binary With Libraries de Build Phases.

    • Si vous souhaitez ajouter une bibliothèque en dehors du chemin de recherche par défaut, vous pouvez inclure le chemin dans Library Search Paths valeur dans les paramètres de construction et ajouter
      _-l{library_name_without_lib_and_suffix}_ (par exemple, pour libz.a, utiliser _-lz_) au Other Linker Flags section de Build Settings.

  2. Vous copiez des fichiers dans votre projet mais vous avez oublié de cocher la cible pour y ajouter les fichiers . Résoudre:

    • Ouvrez le Build Phases pour la bonne cible, développez Compile Sources et ajoutez les fichiers _.m_ manquants. Si tel est votre problème, votez au maximum réponse de Cortex ci-dessous également.

  3. Vous incluez une bibliothèque statique construite pour une autre architecture comme i386, le simulateur de votre ordinateur hôte. Résoudre:

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

    • Vous pouvez éventuellement créer une grosse bibliothèque statique qui contient les deux architectures.



Réponse originale:

Vous n'avez pas lié au bon fichier libz. Si vous cliquez avec le bouton droit sur le fichier et que vous révélez dans le Finder, son chemin doit se trouver quelque part dans un dossier iOS sdk. 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 l'ajouter à nouveau dans la section Phases de génération de liens de binaires avec bibliothèques de votre cible.

496
Joe

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

La solution consistait à ouvrir l'onglet Construire les phases, puis Compiler les sources, et à faire glisser la classe dans la liste.

197
Cortex

J'avais un problème similaire et je devais vérifier "Construire une architecture active uniquement" dans chacune des configurations du projet (Debug, Release and Deployment) et dans les paramètres de construction de la cible.

37
Alex Zavatone

Une autre cause possible d'erreurs de l'éditeur de liens "symbole indéfini" consiste à 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 à partir d'Objective-C++

21
user2166865

J'ai eu un problème similaire avec cela. Le nom de la classe après _OBJC_CLASS _ $ _ était en fait ma classe. La raison en est que je n'ai pas coché "Ajouter à la cible" lorsque j'ai fait 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 de nouveau glisser les fichiers de code source et assurez-vous que la case "Ajouter à la cible" est cochée. La case à cocher est juste sous "Copier si nécessaire" et "Créer un groupe".

14
syoleen

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

8
zaph

Sous Cible -> Paramètres de construction -> Apple Langage du compilateur LLVM: le réglage de 'Dialecte de langage C++' et de 'Bibliothèque standard C++' sur la valeur par défaut du compilateur a permis de le résoudre.

5
user1368045

J'avais le même problème quand j'utilisais la bibliothèque admob, je l'ai corrigée en changeant "Architectures" en "Architectures standard armv7, armv7s" sans inclure 64 bits. Build Settings

5
pabloverd

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

J'ai modifié 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++)

5
Andrew Soltan

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

Steps -

  1. Aller à construire des phases.
  2. Lien binaire avec 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. Construire et exécuter.
5
girish_vr

Si vous avez l'indicateur _-ObjC_ sous votre cible> Paramètres de construction> Autres drapeaux de l'éditeur de liens et que vous rencontrez ce problème, envisagez de le supprimer. Si vous l'avez ajouté intentionnellement, car vous devez charger du code Obj-C à partir d'une bibliothèque statique qui ne serait normalement pas chargée autrement, par exemple une catégorie Obj-C, vous devez utiliser _-force_load <path>_ au lieu de _-ObjC_.

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

_iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj
_

Ensuite, vous devriez définir cet indicateur pour _Other Linker Flags_:

_-force_load iOSAPI.framework/iOSAPI
_

Si vous souhaitez inclure plusieurs bibliothèques de ce type, vous devez inclure une ligne distincte _-force_load_ pour chacune d’elles.

_-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
_
4
ArtOfWarfare

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.

4
James

Voici comment j'ai eu ce problème:

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

Vérifiez ma réponse parce que j'ai eu un problème similaire que j'ai pu résoudre en effectuant certaines étapes.

4

Allez dans votre projet, cliquez sur Build phases, Compile sources, puis ajoutez GameCenterManager.m à la liste.

3
Dhaval Sarvaiya

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 de projet (barre latérale droite), ouvrez la barre latérale Utilitaires (barre latérale droite). Dans la fenêtre Utilitaires, sélectionnez l'inspecteur de fichier (icône semblable à un 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 "Ajouter aux cibles" astuce.

Donc: Sélectionnez la classe -> tilitaires (Inspecteur de fichier) -> Adhésion à la cible -> Cochez les cibles souhaitées. .

3
andrei

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

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

3
Stan

Je faisais face à un problème avec les bibliothèques PJSIP,

Essayé ce qui suit dans d'autres drapeaux 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 over github . Ces paramètres vous aideront à résoudre les problèmes liés à la liaison de bibliothèques C++.

2
Adeesh Jain

Je n'ai pas trouvé cette suggestion ici, donc ça va: si votre projet a plus d'une cible (c'est-à-dire une pour OSX et une pour iOS), vous devez relier les bibliothèques appropriées pour chaque cible .. Ainsi, par exemple, dans mon cas, j'avais besoin de AudioToolbox .. Je devais l'ajouter une fois pour OSX et une fois pour iOS (sous le dossier frameworks, vous devez disposer d'un duplicata de chaque bibliothèque pour chaque cible .. si vous voyez seulement un .. alors c'est un drapeau rouge)

2
abbood

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 construction cible pour "Bibliothèque standard C++" était défini sur "libc ++" (nécessaire car le projet utilisait certaines fonctionnalités de C++ 11). le projet incluait un sous-projet avec le même paramètre défini sur 'libstdc ++' (ou le compilateur par défaut tel qu'il est actuellement).

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

1
Si.

Pour ce que cela vaut, le mien a été corrigé après que je sois allé à target-> Build Phases-> Link Binary With Libraries, supprimé la référence libstdc ++. Tbd, puis ajouté une référence à libstdc ++. 6.0.9.tbd.

1
n8n8baby

Si vous construisez à partir de 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 parcourez vos avertissements dans l'éditeur de Unity, l'un d'eux vous le dira et avertira que cela pourrait causer 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 immédiatement, peut-être même plus d'un. Les doublons auront un '1' à la fin du nom du fichier. Cela est probablement dû à la mise à jour de l'éditeur de plug-in via le magasin ou l'onglet de menu Prime31.

1
Dela Torre

J'ai eu ce problème quand je lance l'application sur iphone5s, il a été résolu par add arm64 à Architectures.

1
alexqinbj

Je vous donne plus de suggestions que vous pouvez vérifier lorsque d’autres suggestions courantes ne vous aident pas.

Si vous vous associez à un autre projet (libxxx.a), vous pourriez 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 devriez vérifier si les deux projets sont construits avec les mêmes drapeaux, certains d'entre eux pouvant affecter le format binaire.

  1. vérifiez le compilateur c ++.
  2. vérifiez le réglage du dialecte c ++.
  3. vérifiez la prise en charge du type d'exécution c ++. (-frtti/-fnortti)
  4. vérifiez si .a avec le même nom apparaît ailleurs, peut être au-delà du fichier voulu dans la liste des chemins de liens. retirez-les.
1
fluke

Pour moi, le problème était que i oublier pour définir la valeur de mes constantes dans le . M (implémentation)

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

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

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 enlevé -all_load de la Other Linker Flag et tout fonctionne correctement dans le simulateur et le périphérique iphone.

1
Jordan

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

XCode .m vs. .mm

cela expliquait comment il fallait renommer main.m en main.mm pour que les classes Objective-C++ puissent également être compilées.

Cela a réglé le problème pour moi.

1
Vito Andolini

Enfin, j'ai compris, j'ai résolu ce problème en ajoutant un cadre absent à target-> Build Phases-> Link Binary With Libraries

1
lomec

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'exception de frameworks), puis les ai ajoutées à nouveau correctement via l'option Ajout de fichiers au projet, le problème a disparu.

1
Vaibhav Saran

J'ai eu le même problème. J'ai tout essayé dans l'énorme liste de réponses, mais à la fin, mon problème était: je travaille avec openCV, je dois donc 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é de fichier et ce fichier n'a aucun lien avec le code C++, mais j'ai dû le changer.

1
user2743760

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

Résoudre ce problème a corrigé l'erreur.

1
user2158690

Dans mon cas, j'avais un problème similaire lorsque j'ai créé une nouvelle branche sous contrôle de source.

J'ai pu résoudre ce problème en allant simplement Product>Clean

0
Anthony Dito

renommez votre fichier m (qui inclut les méthodes funcs) en mm ou inversement pour résoudre votre problème. mine résolu renommer mm en m ou m en mm.

0
Kursat Turkay

Essayez d'implémenter au moins une fonction non inline de votre classe dérivée. Si vous ne le faites pas, l'éditeur de liens pourrait éviter de créer des informations de type pour cette classe.

0
Michael Litvin

J'ai eu cet avertissement lorsque j'ai écrit deux classes dans le fichier .h d'une autre classe, mais FORGOT pour écrire l'implémentation de cette classe dans le fichier .m.

0
Nik Kov

Dans Xcode Version 6.3.2, j'ai résolu exactement le même problème en ajoutant Library libxml2.dylib et libz.dylib In Link Binary With Libraries!

0
Stephen Chen

Je faisais face au même problème lorsque j'ai inclus un framework tiers.

Le problème a été résolu lorsque j'ai supprimé armv7s de l'entrée Architectures valides dans les paramètres de construction de la cible, cela a commencé à fonctionner.

0
Easwaramoorthy K