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.
la source
$(inherited)
à d' autres indicateurs de liens, nettoyez et construisez.Réponses:
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.
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):
la source
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".
la source
Valid Architectures
etArchitectures
.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!!
la source
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).
la source
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:
la source
Dans mon cas, ce n'était pas une bibliothèque, c'était quelques cours.
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
J'ai donc dû les ajouter manuellement.
alors je pourrais compiler et construire avec succès.
la source
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.
Ou
~ / Bibliothèque / Développeur / Xcode / DerivedData /
la source
~/Library/Developer/Xcode/DerivedData/
via la CLI que vous pouvez nettoyer le répertoire comme suit:rm -rf ~/Library/Developer/Xcode/DerivedData/
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é)
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.
la source
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.
la source
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:
rm -Rf Pods; pod install
la source
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é.
la source
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:
à Oui
et le projet se compile et se construit correctement
la source
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.
la source
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écuteznm -g
sur 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.Vous pouvez inspecter les symboles C ++ démêlés avec ceci:
la source
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.
la source
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.
la source
Je l'ai résolu en ajoutant "-lc ++" dans les autres indicateurs de l'éditeur de liens dans les paramètres de construction.
la source
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é.
la source
Il peut également s'agir d'un
#include <windows.h>
fichier .c que vous essayez de compiler.la source
dans mon cas, j'ai dû ajouter
dans mon fichier pod, puis supprimez le répertoire / Pods et exécutez `pod install`(Xcode 10.1)
la source
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 sources
et ajouté le nouveauVC.m
fichier 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
.m
fichiers 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.
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.
la source
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.
la source
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.
la source
Dans mon cas, le problème était l'architecture du framework compilé.
J'utilise Xcode 11 et j'utilise Swift 5.1
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.
la source