web-dev-qa-db-fra.com

Erreur dans l'éditeur de liens Xcode 6 - Symboles non définis pour l'architecture armv7

Après la mise à niveau vers Xcode 6 beta 7 (et maintenant avec Xcode 6 GM), je ne parviens pas à lier mon application Swift. Je reçois des erreurs telles que:

Symboles non définis pour l'architecture armv7: "_Swift_stdlib_compareNSStringDeterministicUnicodeCollation", référencé depuis:

...

ld: symbole (s) non trouvé (s) pour l'architecture armv7 clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)

J'ai vu les autres SO publications qui recommandent de supprimer le dossier Données dérivées et/ou d'utiliser l'option Nettoyer le dossier de construction pour résoudre cette erreur, mais cette solution ne m'a pas du tout aidé. Rien n'a changé concernant mon code ou les CocoaPods que j'utilise depuis Xcode 6 beta 5, qui est la dernière fois que cela a fonctionné.

Des idées?

MODIFIER:

Une publication complète du journal des erreurs:

Symboles non définis pour l'architecture arm64: "_Swift_stdlib_compareNSStringDeterministicUnicodeCollation", référencé depuis: TFC12MyProject21BarcodeViewController13captureOutputfS0_FTGSQCSo15AVCaptureOutput_24didOutputMetadataObjectsGSQGSaPSs9AnyObject_4 "__TFSs21_arrayConditionalCastU___FGSaQ__GSqGSaQ0_", référencé à partir de: TFC12MyProject27SessionsTableViewController17viewWillDisappearfS0_FSbT_ dans SessionsTableViewController.o "__TFSs15_arrayForceCastU___FGSaQ__GSaQ0", référencé à partir de: __TFC12MyProject7RestApi12tokenMappingfS0_FT_CSo15RKEntityMapping dans RestApi.o __TFC12MyProject28AttendeesTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController dans AttendeesTableViewController.o __TFC12MyProject27SessionsTableViewControllerg24fetchedResultsControllerCSo26NSFetchedResultsController dans SessionsTableViewController.o __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb dans BarcodeViewController.o "__TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q_", référencé à partir de: __TFC12MyProject7RestApi12resetRestKitfS0_FT_T_ dans RestApi.o __TFC12MyProject16BluetoothManager17_startAdvertisingfS0_FT_T_ dans BluetoothManager.o __TFC12MyProject19LoginViewController32registerForKeyboardNotificationsfS0_FT_T_ dans LoginViewController.o __TFC12MyProject19LoginViewController35deregisterFromKeyboardNotificationsfS0_FT_T_ dans LoginViewController.o __TFC12MyProject19LoginViewController16callProcessLoginfS0_FT_T_ dans LoginViewController.o __TFC12MyProject21CheckinViewController16enableBeaconModefS0_FT_T_ dans CheckinViewController.o __TFC12MyProject21BarcodeViewController13startScanningfS0_FT_Sb dans BarcodeViewController.o ... ld: symbole (s) non trouvé (s) pour l'architecture arm64 clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)

23
davidethell

Ce qui se passe ici n'a rien à voir avec votre emplacement de données dérivées.

Quand une application Swift est construite, elle passe par plusieurs étapes:

  • Écrire des fichiers auxiliaires

  • Créer une structure de produit

  • Compiler le source Swift pour chaque architecture

  • Copier le plist de règles de ressources

  • Copier l'en-tête de pontage d'application

  • Lien avec les bibliothèques d'exécution Swift pour chaque architecture

  • Copier le module d'application Swift pour chaque architecture

  • Créer le binaire de l'application

  • Copier la phase de construction des ressources

  • Copiez les bibliothèques standard Swift dans l'application

  • Emballez-le

  • Le signer

Ouf! C'est beaucoup. Votre construction échoue lors de la liaison avec les bibliothèques d'exécution Swift. Ils vivent dans Toolchains/XcodeDefault.xctoolchain/usr/lib/Swift/iphoneos dans le répertoire de développement Xcode. Plus précisément, la bibliothèque qui n'est pas correctement liée est libswiftCore.dylib. Si vous utilisez nm dans cette bibliothèque, vous pouvez voir qu'il définit votre premier symbole manquant:

quellish% nm /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/Swift/iphoneos/libswiftCore.dylib | grep compareNSStringDeterministicUnicodeCollation
00197c8c T _Swift_stdlib_compareNSStringDeterministicUnicodeCollation
000000000018352c T _Swift_stdlib_compareNSStringDeterministicUnicodeCollation

Vous pouvez également utiliser lipo pour voir quelles architectures se trouvent dans le fichier:

quellish% xcrun lipo -info /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/Swift/iphoneos/libswiftCore.dylib
Architectures in the fat file: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/Swift/iphoneos/libswiftCore.dylib are: armv7 arm64

Il contient armv7 et arm64. Ce n'est pas l'architecture de la bibliothèque qui pose problème.

La liaison avec la bibliothèque standard Swift ne fonctionne pas. Il est possible que le contrôle de source ou la migration des versions de Xcode ait amené votre fichier de projet à supprimer une partie de l'étape de liaison, ou tout simplement, il ne parvient pas à trouver les bibliothèques avec lesquelles il doit être lié. Les fichiers de projet Xcode sont complexes et utilisent beaucoup de références - il est possible qu'une fusion, etc. ait provoqué la dissociation d'une référence critique de l'étape de liaison. Sans un journal de construction complet et un aperçu de votre machine, il peut être impossible de le savoir. 

Comme vous pouvez le deviner, cette bibliothèque n'a rien à voir avec l'emplacement des données dérivées du projet.

Le meilleur moyen d'avancer serait malheureusement de recréer le fichier de projet. Comparer le journal de construction du projet rompu à un projet Swift correctement construit peut fournir certaines informations, mais cela peut aussi être une perte de temps - une solution peut être le problème, mais probablement pas.

Je vous encourage à déposer un bogue et à y inclure le fichier de projet problématique. 

17
quellish

J'ai résolu mon problème en supprimant toutes les données du dossier ~/Library/Developer/Xcode/DerivedData. J'ai lu à ce sujet dans un autre fil de discussion, mais je l'ai ignoré en pensant qu'un nettoyage inclut ce processus! 

9
Brad R

J'ai mis à jour sur Yosemite, Xcode 6.1 . J'ai mis à jour gem xcodeproj (0.19.4) et cocoapods (0.34.4).

J'ai résolu mon conflit par:

Effacement du dossier Library/Developer/Xcode/DerivedData

remplacer dans Cible -> Paramètres de construction -> Liaison -> Autres drapeaux de l'éditeur de liens: $ (OTHER_LDFLAGS)

Archiver la cible -> Phases de construction -> Ressources pour les pods de copie: "$ {SRCROOT}/Pods/Fichiers de support cible/Pods/Pods-resources.sh"

8
Tayfundu37

1) Je rencontre le même problème, mais effacez simplement les applications des données dérivées de User/Library/Developer/Xcode/DerivedData et je suis en mesure d’exécuter le code.

2) Dans votre cas, il fonctionnera en supprimant l’architecture armv7 des paramètres de construction. Et assurez-vous que votre compilateur est le compilateur par défaut dans les paramètres de construction.

Merci, j'espère que cela vous aidera à vous et à tous 

3
Bhavesh Lathigara

'Mise à niveau' vers xcode 6 et l'application Swift ne serait pas conçue pour le simulateur, mais elle fonctionnerait parfaitement sur une erreur liée à l'iPad - Linker, symboles non définis pour i386 pour le simulateur.

Effacer le dossier Library/Developer/Xcode/DerivedData a fonctionné pour moi.

0
m0thman

J'ai eu un problème quelque peu similaire (une erreur de l'éditeur de liens du cadre d'Apple). En réalité, le problème était que je manquais de la bibliothèque LocalAuthentication.framework. Je me demande si vous devez peut-être supprimer Foundation.framework de l'onglet Phase de construction (dans la section Bibliothèques de liens), puis l'ajouter de nouveau. Peut-être que cela résoudra le problème? 

0
user3562213

Cela semble être causé (pour la plupart) par la liaison d'une bibliothèque tierce qui ne prend pas en charge l'architecture demandée.

0
Joshua Nozzi

J'ai résolu ce problème après avoir essayé tout ce qui était suggéré ici sans succès . Comme quelqu'un l'a dit plus tôt, il s'agit d'un problème SourceControl.

L'un des fichiers de mon projet (celui référencé dans le message d'erreur) était manquant dans le navigateur du projet. Cependant, XCode y avait toujours une référence (j'allais à la définition de la classe lorsque je sélectionnais "sauter à la définition" dans l'interface graphique Xcode).

En fait, le projet.pbxproj ne l’a pas répertorié. C'était probablement un problème de Git. En tout état de cause, je viens de recréer le fichier dans le même répertoire qu’il a été recréé et le tour est joué.

0
GrandSteph

Il semble y avoir un bogue dans Xcode 6.0.1 qui amène l'éditeur de liens à supprimer des dépendances dans les fichiers de projet existants. J'ai eu ce même problème dans plusieurs projets différents, nouveaux et anciens, depuis la mise à jour 6.0.1.

La solution facile consiste simplement à jeter toutes vos «données dérivées» et tous les fichiers de construction (c'est-à-dire nettoyer manuellement le projet), puis à reconstruire après un nouveau redémarrage de Xcode. Comme par magie, l'éditeur de liens trouve maintenant toutes les architectures/symboles manquants.

NOTE: J'ai eu plusieurs plantages de v-table incompatibles causés par ce même bogue. L'éditeur de liens C++ semble générer des liaisons incomplètes, provoquant des erreurs absurdes où il n'y a pas d'erreurs real . Encore une fois, il suffit de reconstruire à partir d'un état propre et .. ta da .. vous épargnez BEAUCOUP de maux de tête et de perte de temps à rechercher un non-problème.

0
Ralph K

Je suis une pouliche pour iOS Objective C, même si je code dans plusieurs autres langues depuis de nombreuses années. Donc, je poignarde dans le noir la plupart du temps avec Objective C. 

J'ai commencé à avoir cette erreur, "Symboles non définis pour l'architecture armv7", directement après la déclaration de variables "globales" dans mon fichier .h comme ceci: 

extern NSString *globalNotes;
extern NSString *globalUserCountry;

Je faisais alors référence à ces variables du fichier .m comme ceci:

globalNotes= @"Error (Marker 1010)";
globalUserCountry= @"No result";

LE CORRECTIF - Pour corriger cela, je les ai changés en propriétés d'objet comme ceci:

@property(nonatomic, strong, readwrite) NSString *globalNotes;
@property(nonatomic, strong, readwrite) NSString *globalUserCountry;

Et fait référence à eux comme suit:

self.globalNotes= @"Error (Marker 1010)";
self.globalUserCountry= @"No result";

Cela a semblé résoudre mon problème. 

0