Symboles non définis pour l'architecture i386: _OBJC_CLASS _ $ _ SKPSMTPMessage ", référencé à partir de: erreur

236

J'ai importé un framework pour envoyer des e-mails depuis une application en arrière-plan, c'est-à-dire un SKPSMTPMessageframework. Quelqu'un peut-il suggérer pourquoi l'erreur ci-dessous est affichée

Undefined symbols for architecture i386:

"_OBJC_CLASS_$_SKPSMTPMessage", referenced from:
  objc-class-ref in ConfirmController.o

"_kSKPSMTPPartContentTransferEncodingKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartMessageKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

"_kSKPSMTPPartContentTypeKey", referenced from:
  -[ConfirmController sendEmail] in ConfirmController.o

ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Source à partir de laquelle le cadre est tiré: -

Verrouillage des champs dans MFMailComposeViewController

Mise à jour :

Réponse: il suffit de glisser-déposer le dossier sur le projet et de cliquer sur copier. C'est aussi sélectionner la case à cocher projet et la case à cocher cible.

Mann
la source
Après avoir ajouté SystemConfiguration.framework à partir des phases de construction, mon projet se compile bien
swiftBoy
J'ai résolu ce problème. J'ai ajouté le cadre requis pour lier le binaire aux bibliothèques.
Mihir Oza

Réponses:

569

Vous pouvez obtenir ce type d'erreur si le fichier .m de votre classe n'est pas répertorié sous l'étape "Compiler les sources" de l'onglet "Générer des phases" de votre cible. Normalement, Xcode le fait pour vous, mais parfois il perd le tracé et vous devez ajouter le fichier .m manuellement.

Pour faire ça:

TargetSettings -> Build Phases -> Compile Sources -> add your .m class -> Build and Run

Allen Pike
la source
49
Parfois, ces erreurs apparaissent car certains frameworks ne sont pas correctement liés. Vérifiez simplement tous les cadres dans "Lier le binaire aux bibliothèques" dans l'onglet de la phase de construction du projet.
Heitara
Cela peut également se produire avec des fichiers .c, et probablement .mm aussi.
brodney
Rajneesh, avez-vous résolu le problème? Si oui, comment l'avez-vous corrigé?
codematrix
9
Il convient de noter que vous pouvez sélectionner le fichier .m et cocher la case à côté de votre cible dans la section "Adhésion cible" du panneau de droite. Lorsque vous ajoutez un fichier à votre projet, on vous demande si vous voulez "Ajouter aux cibles:", vous avez peut-être dit non, mais vous pouvez l'ajouter à tout moment en faisant ce que j'ai dit.
Nicolas S
4
J'avais l'habitude d'avoir la même erreur, la solution pour la mienne est: Build Setting -> Linking -> Other Linker Flags -> Add -lLibraryName_$(PLATFORM_NAME)dfor Debug , and add -lLibraryName_$(PLATFORM_NAME)for Release
George
37

pour moi, le problème s'est avéré être des cadres manquants. Une fois que je les ai ajoutés, cela a fonctionné.

verma
la source
Cela semblait être un processus de longue haleine car il ne correspondait pas vraiment aux messages d'erreur que je recevais, mais l'ajout des cadres dépendants suggérés sur le site SocketRocket le corrigeait également pour moi.
Pat
Même si vous ajoutez des frameworks via des cocoapodes, cela peut arriver. J'ai dû l'ajouter manuellement comme cadre également. Merci!
FBente
Le cadre que j'ai ajouté avait besoin que d'autres cadres soient ajoutés avant de se construire. Si vous ajoutez un Framework, assurez-vous d'avoir ajouté le Framework dont il a besoin
Dave Patrick
29

Vérifiez les propriétés Valid Architectures & Build Active Architecture only.

entrez la description de l'image ici

Akshay
la source
1
pouvez-vous s'il vous plaît me dire comment ouvrir cette fenêtre d'options dans Xcode 4.2
Anand
Si cela n'aide pas, voir la réponse d'Allen Pike ci-dessous.
MattyG
Cette réponse et celle d'Allen m'ont aidé. J'ai vraiment dû vérifier les deux choses: compiler les sources et créer une architecture active uniquement. Merci beaucoup les gars!
Bogdan
@Anand Ils sont dans les paramètres de construction de la cible.
lifelogger
18

si vous utilisez des cocoapods, assurez-vous que les paramètres de construction de votre cible contiennent $ (hérité) dans la section des autres indicateurs de l'éditeur de liens

entrez la description de l'image ici

Tim
la source
10

Votre framework est-il compilé pour armv (x)? Il me semble qu'il a été compilé pour i386, dont le code ne fonctionnera pas sur un appareil iOS. Ou bien il est compilé pour armv (x) et vous essayez de l'exécuter sur le simulateur, qui est le code i386. Assurez-vous, en utilisant les paramètres de construction d'Akshay affichés ci-dessus, que votre framework est correctement compilé pour la puce sur laquelle vous allez l'exécuter.

Owen Hartnett
la source
C'est trié. je devais simplement faire glisser le cadre forlder dans mon projet forlder dans xCode. Merci
Mann
est-il possible de compiler en quelque sorte un framework pour fonctionner à la fois sur un appareil iOS et un simulateur? ou devrais-je toujours choisir une seule option?
Aleksey Tsyss
Parlez-vous d'ouvrir deux fenêtres sur le même projet et d'en configurer une pour qu'elle s'exécute sur le simulateur et une autre sur l'appareil?
Owen Hartnett
7

Si vous importez un autre projet dans xcode et si le projet en cours et le projet d'importation ont tous les deux les mêmes fichiers dans la source du compilateur, supprimez simplement le même fichier dans le projet en cours dans les paramètres de "Phase de construction". Cela a fonctionné pour moi.

star18bit
la source
4

Oui, cela est lié à ce que Allen a dit ... recherchez TargetMembership dans la section Utilitaires du fichier source. il y a une case à cocher qui associe ce fichier à un projet. Vérifier cela a résolu ce problème pour moi aussi.

ouaisdixon
la source
J'ai modifié tous les autres paramètres, mais c'est celui qui l'a finalement corrigé pour moi. Merci!
Alec Thomas
4

Il est également possible que vous n'ayez pas de lien avec une bibliothèque binaire, vérifiez les phases de construction dans vos tarifs, ajoutez les bibliothèques requises, puis Produit> Nettoyer le produit> Créer

Ça doit aussi marcher!

Gabriel Ramirez
la source
4

J'ai eu ce problème lorsque j'ai ouvert le même projet deux fois, un seul projet était l'original et l'autre a été cloné à partir d'une URL git.

'Produit'> 'Nettoyer' a résolu le problème.

kraftydevil
la source
4

J'ai également rencontré ce problème et je l'ai résolu en vérifiant si la source de compilation et le lien binaire avec la bibliothèque contenaient tous les fichiers / bibliothèques / framework dont j'avais besoin.

entrez la description de l'image ici

yujohnnyzhou
la source
4

Quand j'ai rencontré le même problème que celui-ci:

Symboles non définis pour l'architecture i386:

_OBJC_CLASS _ $ _ SKPSMTPMessage, référencé à partir de: objc-class-ref dans ConfirmController.o

Il s'est avéré que j'ai juste oublié d'ajouter un cadre. C'était QuartzCore.framework pour être exact.

Mitch Viray
la source
@JayprakashDubey Demandez à Mitch s'il vous plaît
D_D
4

essayez celui-ci en dernier:

j'ai donc essayé toutes les suggestions sur cette page .. aucune n'a fonctionné .. La façon dont mon problème a commencé était en suivant les étapes de ce tutoriel qui enseigne comment lier des bibliothèques statiques. Avec mon exemple de projet, les instructions ont bien fonctionné .. mais sur mon projet réel, j'ai commencé à obtenir l'erreur ci-dessus.

Donc , ce que je faisais était passer par chaque étape de ladite tutoriel et construit après chaque étape .. la ligne incriminée est avéré être celui - ci: l' ajout -all_load à construire Paramètres-> autres drapeaux de l' éditeur de liens

il s'est avéré que ce drapeau était recommandé une fois pour lier les catégories aux bibliothèques statiques .. mais il s'est avéré que ce drapeau n'était plus nécessaire Xcode 4.2+ .. (il en va de même pour le drapeau -force_load .. qui était également recommandé dans d'autres postes ) ..

abbood
la source
3

Lorsque j'ai rencontré le même problème, j'ai oublié d'ajouter "version compilée de la bibliothèque (avec l'extension .a)". Normalement, nous ajoutons la bibliothèque du projet importé dans Dépendance cible dans les phases de construction, mais nous oublions d'ajouter "bibliothèque compilée" dans Link Binary avec les bibliothèques dans les phases de construction.

Balamurugan
la source
3

Ajouter ce qui a fonctionné pour moi au cas où d'autres auraient le même problème et finiraient ici. J'avais un projet plus ancien dont le paramètre CLANG_ENABLE_MODULES était réglé sur Non. Après des heures de frustration, j'ai comparé à un projet qui fonctionnait et j'ai constaté que l'option Activer les modules n'était pas définie dans mes paramètres de construction LLVM. La définition de Oui a résolu mon problème et l'application fonctionne correctement.

Paramètres du projet -> Paramètres de construction -> recherchez «Modules» et mettez à jour les modules d'activation (C et Objective-C) sur OUI.

jlichti
la source
Solution merveilleuse! Cela m'a beaucoup aidé! J'avais un ancien projet de pods et chaque fois que j'ajoutais un nouveau pod, cette erreur se produisait. Merci!!!
DiscDev
2

Je n'ai pas ajouté le "-all_load -lstdc ++" à d'autres indicateurs de l'éditeur de liens dans le paramètre de génération et j'ai pu lancer la simulation sans erreur, mais je n'ai pas obtenu la sortie du journal MonkeyTalk lors du lancement et le script précédent que j'ai écrit et utilisé pour se connecter montrait maintenant le bouton de lecture comme désactivé. La sortie de MT IDE s'affiche comme "Connexion définie sur iOS Simulator", mais pas en mesure de sélectionner le bouton d'exécution / lecture.

Le projet d'origine avait "ObjC -all_load" dans les autres drapeaux de l'éditeur de liens et quand j'ai ajouté le "-all_load -lstdc ++" avec lui, j'ai reçu le message d'erreur sur ce post. Lorsque j'ai supprimé le "ObjC -all_load" et ajouté uniquement le "-all_load -lstdc ++" que le projet a construit, mais toujours pas de déconnexion de conversation de singe mise comme confirmation dans la console

Laser Hawk
la source
2

Il est possible que vous utilisiez une bibliothèque qui n'est compilée que pour du VRAI matériel. Par exemple, si vous utilisez une bibliothèque Bluetooth comme le Zephyr HxM Smart, elle ne se compilera probablement pas sur le simulateur et est uniquement destinée à fonctionner sur de vrais appareils.

DiscDev
la source
1

A rencontré un problème similaire avec IOS 6. A pu le résoudre en ajoutant storekit.framework au "Link Binary with Libraries" dans la section des phases de construction.

Maintenant, cela fonctionne comme un charme.

Troy
la source
1

j'ai le même problème avec 7 erreurs lorsque j'ajoute PSTCollectionviewcontroller. La seule solution à ce problème est de vérifier vos "xcode -> phases de construction -> sources de compilation" ici ajoutez tous vos fichiers ".m" .. J'espère que vous poster aidera les utilisateurs à l'avenir.

Naveen
la source
1

Sur le mien, j'utilisais des Cocoapods pour un projet de réalité augmentée et ce que j'ai découvert, c'est que lorsque vous implémentez des cocoapods et ouvrez l'espace de travail de votre projet, vous vous retrouvez avec la cible du projet Xcode et ces cibles Pods que vous avez implémentées dans le même fichier. Ce qui se passait, c'était qu'une partie du .m était utilisée par les deux. Après avoir supprimé les doublons pour la cible Xcode dans Build Phases >> Compile Sources, cela a bien fonctionné.

Joao Paulo
la source
1

J'ai découvert ce message TRÈS trompeur en essayant de passer à la nouvelle bibliothèque Google Analytics.

Dans mon cas, le problème était d'avoir DEUX COPIES CONFLITANTES de la bibliothèque. Ils se trouvaient dans des dossiers différents, mais les deux étaient répertoriés dans les chemins de génération de bibliothèque de mon application (sous Paramètres de génération).

Le déplacement de tous les fichiers de bibliothèque obsolètes hors du dossier a fini par faire l'affaire et a fait disparaître les mystérieux messages d'erreur.

bkbeachlabs
la source
1

Vérifiez que toutes vos ressources de bundle sont copiées en phase de génération.

Arpan Dixit
la source
1

Produit => Clean a fait l'affaire pour moi

YogevSitton
la source
1

Le changement dans l'architecture active a fonctionné pour moi, une de mes bibliothèques utilisait i386.

Dans les paramètres de build >> changer Build Active Architecture Only à Yes de NO

Ça a marché pour moi. J'espère que cela aide aussi les autres.

entrez la description de l'image ici

Satish Mavani
la source
"de NON à OUI" est plus facile à comprendre. Quoi qu'il en soit, cela a fonctionné.
Victor Laerte
0

La réponse est que vous faites simplement glisser-déposer le dossier sur le projet et cliquez sur copier.

Mann
la source
0

J'ai reçu ce message lorsque je glissais et déposais des fichiers source d'un autre projet. Lorsque je les ai supprimés puis ajoutés via le menu "Ajouter des fichiers ..." dans le menu Fichier, il a été construit sans l'erreur.

RyeMAC3
la source
0

J'ai eu une erreur similaire avec NSManagedObject et c'est parce que j'utilisais Core Data mais qu'il manquait le framework Core Data dans Build Phases - Link Binary With Libraries, comme d'autres l'ont répondu

Sam
la source
Bienvenue à SO Sam. Lorsque vous répondez à une question, essayez d'ajouter de nouvelles informations, recherches ou codes qui n'existent pas déjà dans une autre réponse. Si vous voulez simplement partager qu'une autre réponse a fonctionné pour vous, essayez de voter ou de commenter leur réponse au lieu de poster une réponse en double.
butch
0

Vous pouvez obtenir ce type d'erreur si vous ajoutez des bibliothèques tierces dans votre projet qui nécessitent des frameworks natifs non inclus dans votre projet.

Vous devez regarder à l'intérieur des fichiers .h et .m de votre bibliothèque nouvellement ajoutée et voir quels cadres elle nécessite, puis inclure ces cadres dans votre projet (Cible> Phases de construction> Lier le binaire aux bibliothèques).

Cosmin
la source
0

Essayez de supprimer le framework, de nettoyer le projet, de le rajouter et de le compiler. Ou Supprimez la classe qui a été ajoutée par xcode dans la source de compilation, nettoyez le projet, ajoutez-la puis construisez.

Saif
la source
0

N'oubliez pas que vous pouvez mettre une macro dans n'importe quel contrôleur de vue qui appelle les fichiers que vous avez déjà supprimés.

L'application ne montrera aucune erreur tant que vous n'aurez pas créé votre application, elle lancera l'erreur en phase de compilation dans les fichiers .o.

N'oubliez pas de supprimer toute MACRO qui appelle des fichiers que vous avez déjà supprimés.

Merci :)

Abo3atef
la source
0

En plus de ce qu'Allan a fait, en ajoutant des classes manquantes, j'ai suivi la solution de @ emdog4 et ajouté la bibliothèque Core Data en allant dans Build Phases in Xcode et sous le 'Link Binary with Libraries' en cliquant sur le + et en sélectionnant le 'CoreData.framework' . Cela a réglé mon erreur

malkoty
la source