201 votes

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

Une question pour les débutants en 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 les périphériques BT apparié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 commun devrait être une référence à un fichier, dont seuls les fichiers d'en-tête sont importés et aucune implémentation (*.m-file) n'est trouvée par le linker. La bibliothèque IOBluetooth est pourtant un Framework standard comme le Framework Foundation.

Qu'est-ce que j'ai manqué dans ma déclaration ci-dessus ?

J'ai également essayé de le construire pour une machine 32 bits (la construction échoue à nouveau). Il s'agit clairement d'une erreur de liaison, mais je n'ai aucune idée de ce à quoi elle se rapporte, si ce n'est 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 standard inclus, appelé 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 indication dans la bonne direction.

13voto

Udaya Sri Points 1079

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

Symboles non définis pour l'architecture x86_64 :
"_OBJC_CLASS_$_ClassNmae", référencé par : objc-class-ref dans SomeClassName" . . .

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

clang : error : linker command failed with exit code 1 (use -v to see l'invocation)

Solution J'avais plusieurs cibles dans Xcode avec plusieurs schémas (Production, Dev, etc.). Certaines de mes implémentations nouvellement ajoutées (Class.m) manquaient dans le fichier

Xcode->Cibles->Phases de construction->Compilation des sources

J'ai donc dû les ajouter manuellement.

puis j'ai pu compiler et construire avec succès.

9voto

ylgwhyh Points 391

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

Ou

~/Bibliothèque/Developer/Xcode/DerivedData/

enter image description here

8voto

lonesomewhistle Points 588

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

  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

7voto

Anirudha Mahale Points 494

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

La solution facile est de désintégrer et de réinstaller les fichiers pods.

pod deintegrate
pod install

6voto

whyoz Points 1308

Lors de la mise à jour vers Xcode 7.1, vous pouvez rencontrer ce type d'erreur, et elle ne peut être résolue par aucune des réponses ci-dessus. Dans mon cas, l'un des symptômes est que l'application s'exécute sur l'appareil et non dans le simulateur. Vous verrez probablement un grand nombre d'erreurs liées à presque tous les frameworks que vous utilisez.

La solution est en fait assez simple. Il suffit de supprimer une entrée du paramètre "Framework Search Paths", qui se trouve dans la section TARGETS > Build Settings > Search Paths (assurez-vous que l'onglet "All" est sélectionné).

enter image description here

Si vous voyez une autre entrée ici (en plus de $(inherited)) pour votre cible principale ou votre cible de test, supprimez simplement le chemin défectueux de toutes les cibles et reconstruisez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X