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

168

Une question pour un débutant 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 appareils BT jumelés et les imprime sur 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-file) n'est trouvée par l'éditeur de liens. La bibliothèque IOBluetooth est cependant un Framework standard comme le Foundation Framework.

Qu'est-ce que je manque dans ma déclaration ci-dessus?

J'ai également 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'il se rapporte, sauf qu'il y a un problème avec la recherche de l'implémentation pour IOBluetoothDevice, à la fois sur l'architecture x86 et x64, alors que les fichiers d'en-tête proviennent d'un Framework standard inclus, appelé IOBluetooth?

Pour 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.

Soleil levant
la source
17
Essayez d'ajouter $(inherited)à d' autres indicateurs de liens, nettoyez et construisez.
Resty
1
Lorsque j'ai rencontré cela, j'ai trouvé que je devais aller dans l'inspecteur de fichiers pour le fichier m et cocher la case sous l'appartenance cible pour l'exporter (?) Vers le module où j'essayais de l'utiliser.
Landon Kuhn

Réponses:

123

Il semble que vous manquiez d'inclure le cadre IOBluetooth.fr dans votre projet. Vous pouvez l'ajouter par:

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

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

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

-Trouvez le cadre IOBluetooth.fr dans la liste et appuyez sur Ajouter.

entrez la description de l'image ici

entrez la description de l'image ici

Cela garantira que les définitions 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 volet gauche et en voyant l'appartenance cible du framework dans le volet droit (notez que j'ai déplacé le framework sous le groupe Frameworks à des fins d'organisation):

entrez la description de l'image ici

Chris Livdahl
la source
3
Ça a marché! Merci beaucoup aussi d'avoir fait l'effort de prendre des captures d'écran!
RisingSun
La même chose fonctionne bien pour le framework oAuthIOS. Ajoutez le framework oAuthIOS du dossier pods au projet racine que vous essayez de construire
prodeveloper
1
Je cherche IOBluetooth.framework, mais il n'y est pas: S
Menno van der Krift
C'est bizarre, ça devrait être là.
Chris Livdahl
Impressionnant! M'a sauvé quelques heures!
Bravo Kevin
49

UPD

Apple a besoin d'utiliser l' architecture arm64 . 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 "build failure" 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 prennent pas en charge x64.

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

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

entrez la description de l'image ici

Aleksey Potapov
la source
3
En gros, j'ai supprimé le truc arm64 de la propriété Valid Architectures. Ensuite, comme indiqué ci-dessus, il ne sera forcé que de regarder ce qu'il y a dans les architectures valides je suppose!
Randika Vishman
@Vishman, salut! Il existe une bonne réponse SO qui couvre la différence entre Valid Architectureset Architectures.
Aleksey Potapov
Correction de mes erreurs liées dans Xcode 5 lorsque j'essayais d'exécuter le projet dans le simulateur iOS 7.1, dans le simulateur iOS 6.x cela fonctionnait bien par défaut, merci :)
Zsivics Sanel
@BraveS: En supprimant l'architecture arm64, cela fonctionnera-t-il pour un périphérique 64 bits?
Jayprakash Dubey
1
@JayprakashDubey Salut, j'ai téléchargé un appstore intégré sans support 64 bits, ils ont rejeté mon application. Lorsque j'essaie d'ajouter l'arm64, je suis confronté à un échec de construction d'erreur «Symboles non définis pour l'architecture x86_64». si je supprime arm64 de l'architecture. et j'ai mis arm64 dans une architecture valide. Mon application est-elle approuvée ???
SP Balu Kommuri
31

Symboles non définis pour l'architecture x86_64: "_OBJC_CLASS _ $ _ xxx", référencés à 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 le «xxx» afin que cette erreur se produit.

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

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

Confus
la source
17

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 je soupçonne que c'était la cause première).

Donc, si les autres solutions (notamment celles de Chris et BraveS que je soupçonne sont plus probables) ne correspondent pas à votre problème, 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 - je sais que la question d'origine a été répondue correctement).

Ali Beadle
la source
14

Sous Xcode 9.0b5, vous pouvez rencontrer cela car Xcode 9.0b5 contient un bogue où lorsque vous ajoutez du code source, il ne respecte pas les paramètres cibles. Vous devez entrer et définir manuellement la cible de chaque fichier après les mots:

Projet Xcode avec illustration d'adhésion cible manuelle

William Cerniuk
la source
13

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é à partir de: objc-class-ref dans SomeClassName "...

d: symbole (s) introuvable (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 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

Xcode-> Cibles-> Phases de construction-> Compiler les sources

J'ai donc dû les ajouter manuellement.

alors je pourrais compiler et construire avec succès.

Udaya Sri
la source
cela a résolu mon problème. J'utilisais un cadre dynamique. une autre chose est que je n'aime pas l'idée d'ajouter manuellement.
toxicsun
9

J'ai également rencontré le même problème, les méthodes ci-dessus ne fonctionneront pas. J'ai accidentellement supprimé les fichiers dans le répertoire suivant. entrez la description de l'image ici

Ou

~ / Bibliothèque / Développeur / Xcode / DerivedData /

entrez la description de l'image ici

ylgwhyh
la source
4
Pour ceux qui se demandent quel est le chemin / la commande réelle: c'est ~/Library/Developer/Xcode/DerivedData/ via la CLI que vous pouvez nettoyer le répertoire comme suit:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus
6

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

Le correctif est en fait assez simple. Il vous suffit de supprimer une entrée du paramètre "Chemins de recherche du cadre", qui se trouve dans la section CIBLES> Paramètres de construction> Chemins de recherche (assurez-vous que l'onglet "Tous" est sélectionné)

entrez la description de l'image ici

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

pourquoi
la source
5

J'ai trouvé que cela peut é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 qu'il 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, vous pouvez constater qu'après avoir ajouté un dossier, le fichier pbxproj n'a pas changé (et par conséquent, il y a une erreur de liaison). Ainsi, vous obtiendrez un travail de saisie semi-automatique et il trouvera les classes que vous avez importées, mais lorsqu'il construira réellement l'image, il échouera avec ce code d'erreur.

La solution est de ne pas ajouter le dossier mais plutôt d'ajouter les fichiers. Faites cela et vous devriez voir la mise à jour du fichier pbxproj et cela devrait corriger cette erreur.

Cela suppose également que vous avez fait ce qui a été suggéré ci-dessus et que vous avez correctement lié tous les bons cadres.

Agresseur
la source
5

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 é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
sifflet solitaire
la source
4

J'ai eu la même erreur, car au lieu de supprimer un fichier, j'ai simplement supprimé les références à celui-ci. Localiser le fichier dans le Finder et le supprimer a aidé.

Alatoo
la source
3

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 fonctionné.

Je l'ai corrigé cependant en définissant l'option:

Project -> Architecture -> Build Active Architecture Only

à Oui

et le projet se compile et se construit correctement

Raphael
la source
3

J'ai été confronté à ce problème à plusieurs reprises. Cela survient 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
Anirudha Mahale
la source
2

Si vous obtenez cette erreur lorsque vous essayez de créer un lien vers un fichier C, vérifiez d'abord les noms des fonctions pour les fautes de frappe. Vérifiez ensuite que vous n'essayez pas d'appeler une fonction C à partir d'un environnement C ++ / Objective-C ++ sans utiliser la extern C {}construction. Je m'arrachais les cheveux parce que j'avais une classe qui était dans un fichier .mm qui essayait d'appeler des fonctions C. Cela ne fonctionne pas car en C ++, les symboles sont mutilés. Vous pouvez en fait voir les symboles concrets générés à l'aide de l'outil nm. Terminal au chemin des fichiers .o, et exécutez nm -gsur le fichier qui appelle le symbole et celui qui devrait avoir le symbole, et 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 ++ démêlés avec ceci:

nm -gC file.o
james_alvarez
la source
2

Dans mon cas, j'ai créé un cadre personnalisé avec la 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. Minimiser le cadre personnalisé La cible de déploiement a résolu mon problème.

Jeffreysuej
la source
2

Je suis en retard à la fête mais j'ai pensé à partager un autre scénario où cela pourrait arriver. Je travaillais sur un framework et je le distribuais sur des cocoapodes. Le cadre avait à la fois des classes et des protocoles objectifs c et rapides et il se construisait avec succès. Lors de l'utilisation de pod dans un autre cadre ou projet, cela donnait cette erreur car j'ai oublié d'inclure les fichiers .m dans podspec. Veuillez inclure les fichiers .swtift, .h et .m dans vos sources podspec comme ci-dessous: s.source_files = "Projectname / Projectname / ** / *. {Swift, h, m}"

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

Pranav Gupta
la source
2

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

Krishna Mudhiraj
la source
1

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 malgré tout. Ensuite, j'ai réassocié la référence en supprimant les groupes qui posaient problème et j'ai ré-ajouté au projet et cela a fonctionné.

green0range
la source
1

Il peut également s'agir d'un #include <windows.h>fichier .c que vous essayez de compiler.

Lorenzo Andraghetti
la source
1

dans mon cas, j'ai dû ajouter

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
dans mon fichier pod, puis supprimez le répertoire / Pods et exécutez `pod install`

(Xcode 10.1)

Brooks DuBois
la source
1

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

Project-> Build Phases-> Compile sourceset ajouté le nouveau VC.mfichier que je venais d'ajouter.

Je travaille avec du code hérité et je suis généralement un swifty, nouveau sur OBJ-C, donc je n'ai même pas pensé à importer mes .mfichiers dans une bibliothèque de sources.

ÉDITER:

Ran dans ce problème une deuxième fois et c'était autre chose. Cette réponse m'a sauvé après 5 heures de débogage. J'ai essayé toutes les options de ce fil et plus encore. https://stackoverflow.com/a/13625967/7842175 Veuillez lui donner du crédit si cela vous aide, mais en gros, vous devrez peut-être définir votre fichier sur sa cible dans l'inspecteur de fichiers.

Ceci est votre inspecteur de fichiers, assurez-vous simplement que toutes les cibles dont vous avez besoin sont "cochées"

Dans l'ensemble, il s'agit d'un code d'erreur très vague qui pourrait être causé pour de nombreuses raisons, alors continuez à essayer différentes options.

valériane
la source
1

Parfois, j'oublie de copier la bibliothèque de Release-universal et de copier par erreur de Release-iphoneos. Habituellement, Release-iphoneos contient un fichier .a qui a été élagué pour X86. et ainsi il donne l'erreur.

Saleh Enam Shohag
la source
1

dans mon cas, supprimer la sélection de l'adhésion cible, puis sélectionner à nouveau résoudre le problème.

Vérifiez la réponse de William Cerniuk avec la photo jointe.

user1105951
la source
0

Dans mon cas, le problème était l'architecture du framework compilé.
J'utilise Xcode 11 et j'utilise Swift 5.1

  • J'avais 3 cibles comme:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

J'ai essayé d'exécuter des tests, mais le produit MyAppFrameWork a été compilé pour les appareils iOS génériques et la cible de test avait besoin d'un bras x86-64, j'ai donc reconstruit Framework pour les simulateurs iOS et les cas de test ont commencé à fonctionner avec succès.

Mohammad Reza Koohkan
la source