web-dev-qa-db-fra.com

Échec de la construction de Xcode "Symboles non définis pour l'architecture x86_64"

Une question de débutant pour Xcode:

C'est ma première expérience avec Xcode 4.6.3.

J'essaie d'écrire un programme de console très simple, qui recherche des périphériques BT couplés et les imprime dans un NSLog.

Il se construit avec l'erreur suivante:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

J'ai cherché comme un fou. Le problème courant devrait être une référence à un fichier dont seuls les fichiers d'en-tête sont importés et aucune implémentation (* .m-fichier) n'est trouvée par l'éditeur de liens. La bibliothèque IOBluetooth est cependant un framework standard comme le Framework Foundation.

Qu'est-ce qui me manque dans ma déclaration ci-dessus?

J'ai aussi essayé de le construire pour une machine 32 bits (la construction échoue à nouveau). C'est clairement une erreur de l'éditeur de liens, mais je n'ai aucune idée de ce qu'elle concerne, sauf qu'il y a un problème pour trouver l'implémentation de IOBluetoothDevice, sur les architectures x86 et x64, alors que les fichiers d'en-tête proviennent d'un Framework inclus IOBluetooth?

Pour votre information mon code principal "main.m" étant:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

Merci pour toute aide ou indications dans la bonne direction.

130
RisingSun

Il semble que vous manquiez, y compris le fichier IOBluetooth.framework dans votre projet. Vous pouvez l'ajouter par: 

-Cliquez sur votre projet en haut à gauche du volet de gauche (l'icône bleue). 

-Dans le volet du milieu, cliquez sur l'onglet Build Phases. 

-Under "Link Binary With Libraries", cliquez sur le bouton plus. 

-Trouvez le fichier IOBluetooth.framework à partir de la liste et cliquez sur Ajouter. 

enter image description here

enter image description here

Cela garantira que les définitions de IOBluetooth.framework sont trouvées par l'éditeur de liens. Vous pouvez voir que le cadre est membre de votre cible en cliquant sur le cadre dans le volet gauche et en visualisant l'appartenance à la cible du cadre dans le volet droit (remarque: j'ai déplacé le cadre sous le groupe Frameworks à des fins d'organisation): 

enter image description here

105
Chris Livdahl

UPD

Apple nécessite d'utiliser arm64 architecture. N'utilisez pas de bibliothèques x32 dans votre projet

Donc, la réponse ci-dessous n'est plus correcte!


Ancienne réponse

Le nouveau Xcode 5.1 définit l’architecture armv7, armv7s et arm64 par défaut.

Et parfois, l'erreur "échec de la construction" Symboles non définis pour l'architecture x86_64 "" peut être causée par cela. Parce que certaines bibliothèques (pas celles d'Apple) ont été compilées pour x32 à l'origine et ne supportent pas x64.

Donc, ce dont vous avez besoin, c'est de changer les "architectures" pour votre cible de projet comme ceci

NB. Si vous utilisez Cocoapods - vous devriez faire la même chose pour la cible "Pods".

enter image description here

48
Aleksey Potapov

Symboles non définis pour l'architecture x86_64: "_OBJC_CLASS _ $ _ xxx", référencé de: objc-class-ref in yyy.o

Cela signifie généralement que vous appelez "xxx" (il peut s'agir d'un framework ou d'une classe) de la classe "yyy". Le compilateur ne peut pas localiser le "xxx" et cette erreur se produit. 

Vous devez ajouter les fichiers manquants ("xxx" dans ce cas) en faisant un clic droit sur le dossier de votre projet dans la fenêtre du navigateur et en tapant sur l'option "Ajouter des fichiers à" VotreNomProjet "". 

Une fenêtre contextuelle ouvrira vos fichiers de projet dans le Finder. Là, vous pouvez voir les fichiers manquants et les ajouter à votre projet. N'oubliez pas de cocher la case "Copier les éléments si nécessaire} _". Bonne chance!!

25
Confused

J'ai également vu cette erreur sur Xcode 7.2 lorsque les données dérivées sont corrompues (dans mon cas, j'ai interrompu une construction et soupçonnais que c'était la cause première).

Donc, si les autres solutions (notamment celles de Chris et de BraveS que je soupçonne être les plus probables) ne vous conviennent pas, essayez de supprimer les données dérivées (Sélectionnez: Fenêtre/Projets/Données dérivées -> Supprimer) et de reconstruire.

(Ajouté pour référence par d’autres personnes - je sais que la question initiale a été répondue correctement).

16
Ali Beadle

Sous Xcode 9.0b5, vous pouvez rencontrer ce problème car Xcode 9.0b5 contient un bogue qui ne respecte pas les paramètres de la cible lorsque vous ajoutez du code source. Vous devez entrer et définir manuellement les mots-clés cibles de chaque fichier:

 Xcode project with manual target membership illustration

11
William Cerniuk

Dans mon cas, ce n'était pas une bibliothèque, c'était quelques cours. 

Symboles non définis pour l'architecture x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", référencé depuis: objc-class-ref in SomeClassName "... 

d: symbole (s) non trouvé (s) pour l'architecture x86_64

clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir invocation)

Solution J'avais plusieurs cibles dans Xcode avec plusieurs schémas (Production, Dev, etc.) .. certaines de mes nouvelles implémentations (Class.m) manquaient 

Xcode-> Cibles-> Construire les phases-> Compiler les sources

Je devais donc les ajouter manuellement. 

alors je pourrais compiler et construire avec succès. 

11
Udaya Sri

J'ai également rencontré le même problème, les méthodes ci-dessus ne fonctionneront pas. J'ai accidentellement supprimé les fichiers du répertoire suivant .  enter image description here

Ou

~/Library/Developer/Xcode/DerivedData /

 enter image description here

9
ylgwhyh

Lors de la mise à jour vers Xcode 7.1, vous pouvez voir ce type d'erreur et cela ne peut être résolu par aucune des réponses ci-dessus. L'un des symptômes de mon cas était que l'application s'exécute sur l'appareil, pas dans le simulateur. Vous verrez probablement un grand nombre d’erreurs liées à la quasi-totalité des frameworks que vous utilisez.

La solution est en fait assez simple. Il vous suffit de supprimer une entrée du paramètre "Chemins de recherche" dans la section TARGETS> Paramètres de construction> Chemins de recherche (assurez-vous que l'onglet "Tous" est sélectionné).

 enter image description here

Si vous voyez ici une autre entrée (à part $ (hérité)) pour votre ou vos cibles principales ou votre cible de test, supprimez simplement le chemin défectueux de toutes les cibles et reconstruisez-le.

5
whyoz

J'ai constaté que cela pouvait également se produire si vous faites glisser un dossier contenant des fichiers Objective-C dans votre projet. Si ce dossier apparaît en bleu, je pense que cela indique qu'il n'est pas correctement lié. Vous pouvez le vérifier (si vous utilisez le contrôle de version), car chaque fois que vous ajoutez de nouveaux fichiers, le fichier pbxproj doit être mis à jour avec des liens vers ces nouveaux fichiers. Cependant, après l'ajout d'un dossier, vous constaterez que le fichier pbxproj n'a pas été modifié (et qu'il existe par conséquent une erreur de liaison). Ainsi, vous obtiendrez un travail de saisie automatique et les classes que vous avez importées seront trouvées, mais quand il créera réellement l'image, il échouera avec ce code d'erreur.

La solution consiste à ne pas ajouter le dossier mais plutôt à ajouter les fichiers. Faites ceci et vous devriez voir la mise à jour du fichier pbxproj et il devrait corriger cette erreur.

Cela suppose également que vous avez suivi les recommandations ci-dessus et que vous avez correctement lié tous les cadres appropriés.

4
Aggressor

J'ai essayé à peu près tout ici mais mon problème s'est avéré être les restes d'une précédente construction de cocoapodes. Ce qui a fonctionné pour moi a été:

  1. rm -Rf Pods; pod install 
  2. Supprimer les données dérivées (Fenêtre/Projets ... sélectionnez votre cible. Cliquez sur le bouton Supprimer)
  3. Reconstruire
3
lonesomewhistle

J'ai eu la même erreur, car au lieu de supprimer un fichier, j'ai simplement supprimé les références. La localisation du fichier dans le Finder et sa suppression ont été utiles.

3
Alatoo

Dans mon cas, j'ai construit un cadre personnalisé avec une cible de déploiement définie sur 9.1, mais la cible de déploiement de mon application était inférieure, ce qui prend en charge la version 8.1. Réduire au minimum la structure personnalisée La cible de déploiement a résolu mon problème.

1
jeffreysuej

Je sais que c'est une vieille question mais aujourd'hui j'ai eu la même erreur et aucune des solutions ci-dessus n'a marché.

L'ont corrigé cependant en paramétrant l'option:

Project -> Architecture -> Build Active Architecture Only

à oui

et projet compile et construit correctement

1
Raphael

Si vous obtenez cette erreur lorsque vous essayez de créer un lien vers un fichier C, vérifiez d'abord les noms de fonctions pour les fautes de frappe. Vérifiez ensuite que vous n'essayez pas d'appeler une fonction C depuis un environnement C++/Objective-C++ sans utiliser la construction extern C {}. J'étais en train de m'arracher les cheveux parce que j'avais un cours dans un fichier .mm qui essayait d'appeler les fonctions C. Cela ne fonctionne pas car en C++, les symboles sont mutilés. Vous pouvez réellement voir les symboles concrets générés à l'aide de l'outil nm. Fermez le chemin des fichiers .o et exécutez nm -g sur le fichier qui appelle le symbole et celui qui doit en contenir. 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++ associés à ceci:

nm -gC file.o
1
james_alvarez

J'ai fait face à ce problème plusieurs fois. Cela se produit généralement lorsque vous supprimez votre dossier de construction.

La solution simple consiste à désintégrer et à réinstaller les fichiers pod.

pod deintegrate
pod install
0
Anirudha Mahale

dans mon cas, suppression de la sélection de l'appartenance à la cible, puis sélectionner à nouvea résoudre le problème.

Vérifiez la réponse de William Cerniuk avec la photo en pièce jointe.

0
user1105951

Pour moi, cela a commencé à se produire après un conflit de fusion.

J'ai essayé de nettoyer et de supprimer le dossier de construction, mais rien de tout cela n'a aidé. Ce problème a continué à se produire indépendamment. Ensuite, j'ai relié la référence en supprimant les groupes problématiques, puis ajouté de nouveau au projet et cela a fonctionné.

0
green0range

dans mon cas je devais ajouter 

    target 'SomeTargetTests' do
        inherit! :search_paths
    end

(Xcode 10.1)

0
Brooks DuBois

Je l'ai résolu en ajoutant "-lc ++" dans Autres drapeaux de l'éditeur de liens dans les paramètres de construction.

0

Cela pourrait aider quelqu'un. Il m'a fallu des jours pour enfin comprendre. Je travaille dans OBJ-C et je suis allé à: 

Project -> Build Phases -> Compile sources et ajouté le nouveau fichier VC.m que je venais d'ajouter. 

Je travaille avec du code hérité et, comme je ne connais généralement pas OBJ-C pour la première fois, je ne pensais même pas importer mes fichiers .m dans une bibliothèque de sources. 

0
valeriana

Peut-être également un #include <windows.h> dans le fichier .c que vous essayez de compiler.

0

Parfois, j'oublie de copier la bibliothèque à partir de Release-universal et à tort, à copier à partir de Release-iphoneos. Habituellement Release-iphoneos contient un fichier .a qui a été élagué pour X86. et donc cela donne l'erreur.

0
Saleh Enam Shohag

Je suis en retard pour le parti, mais je pensais partager un autre scénario où cela pourrait se produire .. Je travaillais sur un cadre et le distribuais sur des cocoapodes . Le cadre comportait à la fois des classes et des protocoles Objective C et Swift. était en train de construire avec succès . Lors de l'utilisation de pod dans un autre framework ou projet, cette erreur était générée, car j'avais oublié d'inclure les fichiers .m dans podspec . Veuillez inclure les fichiers .swtift, .h et .m dans vos sources podspec ci-dessous: s.source_files = "Nom du projet/Nom du projet/**/*. {Swift, h, m}"

J'espère que cela fera gagner du temps à quelqu'un d'autre.

0
Pranav Gupta