web-dev-qa-db-fra.com

Après la mise à jour vers Xcode 5 - ld: symbole (s) non trouvé (s) pour l’architecture armv7 ou armv7s error linker

Je viens de mettre à jour mon logiciel iPhone 4S pour iOS 7 Bêta 2 alors que j'étais en train de mettre la dernière main à une nouvelle application (Phonegap) .. pas une bonne idée!

Cela fait, Xcode n'a pas détecté mon iPhone et j'ai donc installé Xcode 5 beta. Après avoir bricolé avec elle, je finis par le faire détecter mon téléphone. Le seul problème est qu’il ya une erreur avec l’architecture utilisée.

Voici les erreurs en cours de production:

ld: warning: ignoring file /Users/-----------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a, file was built for archive which is not the architecture being linked (armv7s): /Users/--------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a
Undefined symbols for architecture armv7s:
  "_OBJC_METACLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_METACLASS_$_MainCommandDelegate in MainViewController.o
  "_CDVLocalNotification", referenced from:
      -[AppDelegate application:didReceiveLocalNotification:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_CLASS_$_MainCommandDelegate in MainViewController.o
  "_OBJC_CLASS_$_CDVCommandQueue", referenced from:
      _OBJC_CLASS_$_MainCommandQueue in MainViewController.o
  "_OBJC_METACLASS_$_CDVViewController", referenced from:
      _OBJC_METACLASS_$_MainViewController in MainViewController.o
  "_OBJC_METACLASS_$_CDVCommandQueue", referenced from:
      _OBJC_METACLASS_$_MainCommandQueue in MainViewController.o
  "_CDVPluginHandleOpenURLNotification", referenced from:
      -[AppDelegate application:handleOpenURL:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVViewController", referenced from:
      _OBJC_CLASS_$_MainViewController in MainViewController.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Des idées sur ce en quoi l'architecture devrait être changée afin de la faire fonctionner sur mon téléphone? (ça fonctionne bien sur l'émulateur)

69
barney

Réponse courte:

  • Supprimez Build Active Architecture Only (la clé de paramètre de paramètre de construction est 'ONLY_ACTIVE_Arch') de tous les paramètres de construction de projet de vos bibliothèques statiques ou écrasez-la avec le mot 'NO' comme dans la capture d'écran ci-dessous: Overwrite 'Build Active Architecture Only' to 'NO' or delete it's entry completely to fallback to iOS Default

Réponse détaillée:

Le problème est que votre bibliothèque statique 'libCordova.a' à laquelle vous liez dans votre application principale est uniquement compilée pour une architecture (armv7, mais pas armv7).

Vous avez probablement laissé Xcode effectuer toutes les modifications recommandées pour votre projet de bibliothèques statiques sans lire ce qu’elles sont réellement. Pour ma part, je n'ai jamais pris la peine de regarder de plus près cette boîte de dialogue d'informations (capture d'écran ci-dessous), lorsque je suis passée à une nouvelle version de Xcode - jusqu'à maintenant. enter image description here

Le problème est que l'exécution de ces modifications active pour le débogage génère une nouvelle fonctionnalité appelée Construire une architecture active uniquement (la clé du paramètre de configuration de la construction est 'ONLY_ACTIVE_Arch'). En principe, il s’agit d’une amélioration très intéressante de Xcode, car son paramétrage sur OUI entraîne des temps de construction plus courts, car Xcode compile uniquement l’architecture de l’appareil connecté que vous avez sélectionné en haut lorsque vous cliquez sur le bouton Exécuter.

Cependant, lorsque vous acceptez aveuglément ce nouveau paramètre dans une bibliothèque statique, vous pouvez rencontrer ce bogue. Le bogue survient lorsque vous avez créé la version de débogage d’une bibliothèque statique tout en connectant un périphérique armv7, puis lors du débogage de votre application principale, vous avez connecté un périphérique armv7 (ou inversement). Ensuite, vous obtiendrez l'erreur ci-dessus (ou une erreur similaire).

Ma recommandation est donc de supprimer complètement la valeur au niveau du projet pour Construire une architecture active uniquement de tous les paramètres de construction du projet de vos bibliothèques statiques. Parce que si vous regardez le défaut iOS, c'est NON. Bien entendu, vous pouvez également remplacer le paramètre par "NO" pour vous assurer qu'il est correct, même si, à l'avenir, la valeur par défaut changera (voir la 1ère capture d'écran).

104
Tafkadasoh

Si votre projet a été construit avec Cordova 2.x et Xcode 4.x et que vous recevez l'erreur mentionnée par l'OP, cette solution a fonctionné pour moi. (J'éprouvais l'erreur avec Cordova 2.5 et Xcode 5).

https://issues.Apache.org/jira/browse/CB-3768

Accédez à votre projet Cordova

Dossier racine -> CordovaLib -> Clic droit sur CordovaLib.xcodeproj -> Afficher le contenu du paquet -> Ouvrir project.pbxproj

Remplacez toutes les occurrences de (j'avais 4)

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
        /* other settings here */
};

Avec ceci

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos7.*]" = (
        armv7,
        armv7s,
    );
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
    /* other settings here */
};

Maintenant, votre projet va bien se construire!

75
njtman

J'ai enlevé armv7s de valid architectures section et cela a fonctionné pour moi.

Paramètres de construction -> Architectures -> Architectures valides

Xcode Build Settings

13
Harikrishnan

J'utilise Xcode 5 pour iOS SDK 7. La solution qui fonctionnait pour moi consistait simplement à supprimer l'architecture arm64.

Sélectionnez la cible du projet (PAS CordovaLib.xcodeproj) et dans les paramètres de construction> Architectures valides, supprimez arm64 s'il se trouve dans la liste. Voici le mien après avoir supprimé l'architecture arm64.

enter image description here

11
Malloc

Parce que mon lib.a est pour seulement armv7

ce que j'ai fait était

Architecture active uniquement = oui

buildSettings = {
                ALWAYS_SEARCH_USER_PATHS = NO;
                "ARCHS[sdk=iphoneos*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos6.*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos7.*]" = (
                    armv7,
                    armv7s,
                );

il a été construit et archivé bien

j'espère que ça aide

4
ruzticgirlz

njtman avait une réponse correcte. Je n'ai pas le représentant à commenter alors j'ajoute plus de détails.

Vous avez besoin d'un SDK iOS 7 pour utiliser les architectures standard (armv7, armv7s).

Mon projet était par défaut sur (armv7), sans compter les armv7.

Pour résoudre ce problème, ouvrez CordovaLib.xcodeproj, sous Paramètres de construction (un des menus de la rangée supérieure, alignement centré) sous Architectures, Architectures, Débogage et édition, AJOUTEZ iOS 7.0 à l'aide d'architectures standard.

3
njfrost

Dans les paramètres de construction ...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No
0
Cam Tullos