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.

137voto

Chris Livdahl Points 1342

Il semble que vous n'ayez pas inclus le IOBluetooth.framework dans votre projet. Vous pouvez l'ajouter en :

  • En cliquant sur votre projet dans le coin supérieur gauche du volet de gauche (l'icône bleue).

  • Dans le volet central, cliquez sur l'onglet Phases de construction.

  • Sous "Link Binary With Libraries", cliquez sur le bouton plus.

  • Trouvez le IOBluetooth.framework dans la liste et cliquez sur Ajouter.

enter image description here

enter image description here

Cela permettra de s'assurer que les définitions de IOBluetooth.framework sont trouvées par l'éditeur de liens. Vous pouvez voir que le framework est membre de votre cible en cliquant sur le framework dans le panneau de gauche et en voyant l'appartenance du framework à la cible dans le panneau de droite (notez que j'ai déplacé le framework sous le groupe Frameworks pour des raisons d'organisation) :

enter image description here

50voto

Aleksey Potapov Points 1612

UPD

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

La réponse ci-dessous n'est donc 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 indéfinis pour l'architecture x86_64"" peut en être la cause. En effet, certaines librairies (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 la cible de votre projet comme ceci

NB. Si vous utilisez Cocoapods, vous devez faire de même pour la cible "Pods".

enter image description here

32voto

Confused Points 851

Symboles non définis pour l'architecture x86_64 : "_OBJC_CLASS_$_xxx", référencé à partir de : objc-class-ref dans yyy.o

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

Vous devez ajouter les fichiers manquants (dans ce cas "xxx") en faisant un clic droit sur votre dossier de projet dans la fenêtre de navigation et en tapant sur " Ajouter des fichiers à " Votre nom de projet " option ".

Une fenêtre popup ouvrira vos fichiers de projet dans le Finder. Vous pouvez y voir les fichiers manquants et les ajouter à votre projet. N'oubliez pas de cocher la case " Copie des éléments si nécessaire boîte ". Bonne chance !

18voto

Ali Beadle Points 346

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

Donc, si les autres solutions (notamment celles de Chris et de BraveS, que je soupçonne d'être les plus probables) ne correspondent pas à votre problème, essayez de supprimer les données dérivées (Select : Window / Projects / Derived Data -> Delete) et recompilez.

(Ajouté pour référence par d'autres - je sais que la question originale a reçu une réponse correcte).

15voto

William Cerniuk Points 8832

Sous Xcode 9.0b5 vous pouvez rencontrer ce problème parce que Xcode 9.0b5 a un bug dans lequel lorsque vous ajoutez du code source, il n'honore pas les paramètres de la cible. Vous devez entrer et définir manuellement la cible de chaque fichier par la suite :

Xcode project with manual target membership illustration

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