symbole (s) introuvable (s) pour l'architecture i386

113

Lorsque j'essaye de compiler avec Xcode, j'obtiens l'erreur suivante:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

Pas sûr de ce que ça signifie.

Doz
la source

Réponses:

92

Si ce genre de chose apparaît soudainement, cela signifie généralement que le projet manque de certains cadres dont il a besoin. Les bibliothèques et les projets dépendants peuvent nécessiter des frameworks, donc si vous en avez ajouté un récemment, cela peut provoquer cette erreur.

Pour ajouter des frameworks, cliquez avec le bouton droit sur le nom du projet dans la vue projet, sélectionnez Add, puis sélectionnez Existing frameworks...dans la liste. Ensuite, trouvez le cadre avec les symboles qui vous manquent.

Quant à savoir comment trouver les frameworks dont vous avez besoin, j'ai trouvé que l'utilisation de Google était la plus simple, bien que vous puissiez probablement également utiliser la recherche d'aide Xcode. Recherchez l'un des symboles, en faisant de votre mieux pour déterminer le nom démêlé (par exemple,SCNetworkReachabilityGetFlags ), puis le premier lien de documentation que vous trouverez sur developer.apple.com est souvent le bon. Vous n'avez généralement pas à chasser très loin. Dans ce cas, c'est cette page:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Puis en haut de la page, il vous indique quel framework utiliser, SystemConfigurationdans ce cas. Alors ajoutez cela au projet et compilez à nouveau.

Ensuite, continuez à faire cela jusqu'à ce que cela fonctionne ...

Edit: je n'ai jamais utilisé le simulateur, mais c'est ce que vous faites sur l'appareil - je suppose que c'est la même chose ...

Cœur
la source
64

Parfois, il y a des fichiers source qui manquent à votre cible.

  1. examiner quels symboles manquent
  2. cible-> phases de construction-> source de compilation
  3. ajouter les fichiers source manquants s'ils ne sont pas répertoriés
  4. commande + b pour le bonheur

Vous pouvez sélectionner les fichiers qui semblent "manquants" et vérifier dans la barre d'utilitaires de droite que leurs cases à cocher sont sélectionnées pour la cible que vous construisez.

Nir Pengas
la source
1
Cela peut souvent se produire lors de la fusion incorrecte de deux fichiers de projet et de la perte de l'appartenance à la cible.
Steven Hepting
1
Merci beaucoup, d'une manière ou d'une autre, xcode n'a pas ajouté le fichier .m requis à l'étape des phases de construction!
dreampowder
1
Merci :) Ajoutez 2 fichiers au projet et seulement après avoir effectué ces étapes, tout était OK
user1105951
32

Je l'ai résolu en utilisant la méthode suivante (pour XCode 4):

1) Sélectionnez le projet dans la fenêtre de navigation du projet qui affichera le résumé du projet à droite

2) Sélectionnez les phases de création du 4e onglet

3) Sélectionnez Link binary with library option

4) Ajoutez le cadre pour lequel vous obtenez

5) Déplacez le cadre du dossier principal vers le dossier des cadres

6) Reconstruisez-le et les erreurs ont disparu.

Pruthvid
la source
Je vous remercie. J'ai trouvé cette réponse à la recherche de MFMailCompose, et résolu en ajoutant le MessageUI.framework
Frank Yin
17

Le problème est que l'appartenance cible pour le fichier ajouté est manquante dans la cible de l'application. Sélectionnez donc le fichier et ajoutez la coche à la case d'appartenance cible

Par exemple, si l'erreur indiquée dans une définition de méthode en commun.entrez la description de l'image ici

TV Lithu
la source
J'ai eu cette erreur Symbol Not Found mais la situation était beaucoup plus simple. J'ai ajouté un nouveau module (fichier) avec une nouvelle fonction dont j'avais besoin à l'un de mes schémas. Quand j'ai construit un schéma différent quelques semaines plus tard, l'appel à cette fonction n'a pas été trouvé. L'ajouter à la cible était tout ce qu'il fallait.
Will
17

J'ai pensé ajouter ma solution pour cela, après avoir passé quelques heures sur la même erreur :(

Les gars ci-dessus avaient raison de dire que la première chose à vérifier est de savoir si vous avez manqué d'ajouter des frameworks, voir les étapes fournies par Pruthvid ci-dessus.

Mon problème, il s'est avéré, était qu'une classe de compilation manquait après que je l'ai supprimée, et que je l'ai ensuite ajoutée à nouveau.

Vérifiez vos «sources de compilation» comme indiqué pour les classes d'erreur signalées. Ajoutez toutes les classes manquantes que vous avez créées.

justinkoh
la source
2
MERCI ... Cela fonctionne pour moi. J'implémentais une classe personnalisée. Copié à la fois la classe personnalisée. h et .m dans le projet. Avez-vous fait un #import dessus, l'erreur persiste. L'ajout de la classe personnalisée '.m dans la section "Compiler les sources" l'a résolu!
GeneCode
Impressionnant! J'ai eu le même problème que Rocotilos, j'ai importé une classe personnalisée, importée, mais j'avais toujours un problème. Cela a fait l'affaire! Merci beaucoup!
Souleiman
8

Assurez-vous que le framework manquant est bien répertorié sous "Target / Build Phases / Link Binary With Libraries" sinon ajoutez-le simplement. Comme mentionné précédemment, cela indique généralement un cadre manquant.

Dans mon projet, il y avait deux frameworks identiques répertoriés, lorsque j'ai supprimé l'un d'eux, j'ai eu cette erreur, car il l'a également supprimé de la liste "Link Binary With Libraries". J'ai rajouté et le problème a disparu (et j'ai toujours deux frameworks répertoriés)

Tibidabo
la source
6

J'ai corrigé une erreur similaire sur mon projet en modifiant les paramètres de construction> Architectures pour TOUTES mes cibles.

Le problème: lorsque je suis passé de Xcode 4.4 à Xcode 4.5, mon projet s'est toujours bien compilé sur le simulateur mais ne s'est pas compilé sur les appareils. Sur les appareils, il a jeté l'erreur "symbole (s) introuvable pour l'architecture armv7s", ainsi que les trompeuses "Apple Mach-O Linker Error" et "clang: error: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation ). "

La cause (dans mon cas): mon projet avait plusieurs cibles, et même si les paramètres de construction> Architectures pour la cible principale ont été définis pour inclure l'architecture armv7s, la cible principale dépendait d'une autre cible (répertoriée sous Phases de construction> Dépendances), et Je n'avais pas pensé à réinitialiser les paramètres de construction> Architectures pour cette autre cible, et j'ai dû changer cela pour inclure armv7s. Je suppose que le simulateur et l'appareil fonctionnent sur des architectures différentes, et c'est pourquoi le simulateur fonctionnait bien alors que l'appareil ne l'était pas.

Josh
la source
5

Votre projet dépend-il d'un autre projet, et est-ce une cible de ce projet établie pour être une dépendance directe de votre cible principale? Si tel est le cas et que la dépendance n'est pas configurée, la cible dépendante peut ne pas être construite pour toutes les configurations (c'est-à-dire le simulateur)

Juste une supposition sauvage.

James J
la source
4

Une autre situation qui peut provoquer ce problème est si votre code appelle en C ++ ou est appelé par du code C ++. J'ai eu un problème avec la fonction utilitaire de mon propre fichier .c apparaissant comme "symbole introuvable" lorsqu'elle est appelée depuis Obj-C. Le correctif consistait à changer le type de fichier: dans Xcode 4, utilisez le volet d'informations étendu pour définir le type de fichier sur "Source Objective-C ++"; dans Xcode 3, utilisez "Get Info" pour changer le type de fichier en "source.cpp.objcpp".

nom incorrect
la source
4

Dans mon cas, aucune des solutions affichées n'a fonctionné. J'ai dû supprimer le projet et effectuer une nouvelle vérification à partir du serveur SVN . Heureusement, le projet était hébergé dans un système de contrôle de version. Je ne sais pas ce que je ferais autrement.

otaviokz
la source
2

Dans un projet C ++ utilisant une classe modèle définie , tout en recevant la même erreur, j'ai sélectionné le fichier .cpp avec la classe modèle définie dans le navigateur de projet, puis Supprimer> Supprimer la référence. Le fichier .h associé, tout en étant toujours référencé dans le projet, doit également avoir une instruction #include dans le .cpp comme suit:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Si vous voulez voir, un exemple de projet simple est sur github :

C'est un peu une supercherie d'indirection et je ne me souviens pas de la source originale de cette solution de contournement.

vmanjz
la source
2

Si cette erreur apparaît soudainement, cela signifie que le projet manque de cadres. Les bibliothèques et les projets dépendants peuvent nécessiter des frameworks, donc si vous en avez ajouté un récemment, cela peut provoquer cette erreur.

Pour ajouter des frameworks, cliquez avec le bouton droit sur le nom du projet dans la vue du projet, sélectionnez Ajouter, puis sélectionnez Existing frameworks dans la liste. Ensuite, trouvez le cadre avec les symboles qui vous manquent.

L'autre chose est que si vous avez ajouté des classes dans les ressources compilées et supprimé ces classes du projet, l'erreur apparaît. La meilleure chose à faire est de supprimer les classes des ressources de compilation (Paramètres de construction -> sources de compilation) qui ont été supprimées du projet.

Dans mon cas, j'ai ajouté les classes admob dans le projet et compilé le projet. Dans un cas ultérieur, je ne veux pas inclure admobs dans mon projet, j'ai donc supprimé les références des classes admob de mon projet. Lorsque cette erreur s'est produite, j'ai supprimé la classe .m de mon admob des ressources de compilation a résolu ce problème.

Abhilash Reddy kallepu
la source
2

Cela m'est arrivé en essayant de copier la bibliothèque de démonstration PSPDFKIT dans mon projet. J'ai suivi toutes les instructions du site + toutes les suggestions sur cette page .. pour une raison quelconque, il a continué à donner l'erreur ci-dessus, le problème était que si je greffais le message dans la méthode d'erreur .. il n'apparaissait que dans le binaire ( évidemment je n'ai pas accès au code source b / c je dois payer).

J'ai remarqué cela dans la page d'instructions:

entrez la description de l'image ici

Je suis donc allé aux tripes de ce fichier de configuration et j'ai trouvé ceci:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Ensuite, je suis allé à l'exemple de projet fourni par l'auteur de ladite bibliothèque .. et j'ai remarqué que les indicateurs précédents étaient copiés textuellement dans les autres indicateurs de l'éditeur de liens dans mes paramètres de construction .. mais dans mon projet .. ils ne l'étaient pas! .. Donc Je les ai simplement copiés et collés dans les paramètres de construction de mon projet, d'autres indicateurs de l'éditeur de liens et tout a fonctionné!

point à retenir: si vous comptez sur un fichier .xcconfig sur votre configuration, vérifiez avec un exemple de code source ou quelque chose et assurez-vous qu'il a bien été appliqué .. il n'a pas été appliqué correctement dans mon cas

abbood
la source
0

Une autre raison pour laquelle cela pourrait se produire est lorsque vous METTEZ À JOUR un SDK.

Si vous supprimez simplement le groupe, puis faites glisser et déposez le nouveau dossier dans le projet, le "Chemin de recherche de la bibliothèque" contiendra les deux SDK. Pour résoudre, supprimez simplement l'ancien chemin du SDK.

samwize
la source
0

J'avais utilisé un CLGeocoder sans ajouter un Framework Core.Location. Fondamentalement, cette erreur peut signifier plusieurs choses. J'espère que ça aidera quelqu'un d'autre.

logixologue
la source
0

J'ai été déconcerté par celui-ci avant de réaliser que j'ai ajouté une @interface de données uniquement et que j'ai oublié d'ajouter le bloc @implementation vide.

Steve Tranby
la source
0

Je suis tombé sur ce problème dans Xcode 11, le correctif changeait la cible de déploiement minimum de 10,0 à 11,0, j'espère que cela aidera quelqu'un :)

VeganKid
la source