web-dev-qa-db-fra.com

symbole en double _OBJC_METACLASS _ $ _ nom_classe

J'essaie d'exécuter mon application cocos2d et je fais face à cette erreur, car j'ai récemment mis à niveau mon sdk vers la version 4.2 et mon cocos2d vers la version 0.99.5.

J'ai essayé de nettoyer mon projet, même en changeant le déploiement ios cible, mais l'erreur reste la même. Renommez également le className ainsi afin d'éviter la duplication à partir des noms de classes Library de cocos2d.

ld: symbole en double _OBJC_METACLASS _ $ _ MenuSceneNew in /Users/umaidsaleem/Desktop/functionalityTest/build/Debug-iphonesimulator/libcocos2d bibliothèques.a (MenuScene.o) et /Users/umaidsaleem/Desktop/functionalityTest/build/functionalityTest.build/Debug-iphonesimulator/functionalityTest.build/Objects-normal/i386/MenuScene.o

43
user366584

Vous liez le fichier MenuScene.m deux fois. Vous l'avez apparemment dans une bibliothèque statique et également dans votre application principale. 

52
JeremyP

Une autre chose assez simple à vérifier est que vous n'avez pas accidentellement #import un fichier .m au lieu d'un fichier d'en-tête .h

Qui m'est arrivé.

165
derekv

Une autre raison à cela, pour ceux qui ont fait la même chose que moi, est peut-être que vous avez recréé une classe d'objets gérés. En faisant cela et en choisissant un autre groupe dans la structure du projet, vous créez accidentellement une autre référence aux mêmes fichiers.

Je me suis retrouvé avec deux références pour l'en-tête et l'implémentation à la fois dans la racine du projet et dans mon groupe de modèles. La suppression des références les plus élevées aux fichiers .h et .m a permis d’éviter l’échec de la liaison.

37
Egil Rausner

Parfois, les données de base insèrent AnyProjectNameModel.xcdatamodeld dans les sources de compilation des phases de construction. Vérifiez-le et supprimez-le et tout est réexécuté .... Le message d'erreur indique uniquement les objets ManagedObjects générés .... Le lieu correct pour AnyProjectNameModel.xcdatamodeld est constitué des ressources de regroupement dans les phases de construction .. .  enter image description here

23
BootMaker

Vérifiez les sources de compilation de votre cible et voyez si un fichier class.m est inclus deux fois

15
Jibeex

Une erreur stupide que j'ai faite est que j'ai nommé mon @implementation de la même façon que ma super-classe.

Dans le .h

@interface Subclass : Superclass
@end

Dans le .m

#import "Subclass.h"

@implementation Superclass
@end

Aucune des suggestions régulières de Google n'a semblé aider. Si quelqu'un est aussi fou ou fatigué que moi (peut-être un mélange sain des deux), assurez-vous de ne pas dupliquer un @implementation!

6
RileyE

Dans mon cas, cela se produisait car Xcode générait automatiquement ma classe NSManagedObject, qui était ensuite en conflit avec ma classe NSManagedObject créée manuellement. Dans ce cas, vous pouvez définir "Codegen" sur "Manuel/Aucun" dans l'inspecteur de modèles de données pour votre entité nouvellement créée.

4
Tonnie

Pour moi, la suppression de -all_load de 'Autres drapeaux de l'éditeur de liens' a résolu le problème.

2
Korbinian Breu

Une autre chose à vérifier pour le double lien - il est possible d'avoir le même fichier à deux endroits différents dans la liste de fichiers sur la gauche. Ensuite, le compilateur le compile et le lie deux fois. 

Cela se produit par exemple lorsque vous organisez votre hiérarchie de fichiers. 

Vous n'avez pas besoin de créer une bibliothèque ou quelque chose d'extraordinaire - faites simplement glisser un fichier .m vers deux emplacements différents dans l'arborescence du projet.

N'oubliez pas de ne supprimer que la référence à l'un d'entre eux, aucune suppression de fichier n'est nécessaire. 

2
Tom Andersen

J'ai également eu cette erreur particulière se produire lorsqu'un fichier qui n'a pas été ajouté au projet est référencé quelque part dans le projet. Les deux cas où j’ai vécu cette situation sont ceux où j’ai supprimé/supprimé des fichiers du projet sans en supprimer les références, et lorsqu’on collabore à un projet où un coéquipier a ajouté la référence mais que je n’ai pas ajouté le fichier à ma version projet.

Je sais que le PO a résolu son problème, mais j’ai pensé que cela pourrait aider une autre personne qui lit cette question tout en cherchant de l’aide.

2
EmphaticArmPump

J'ai trouvé la solution moi-même, désolé pour la publication peu différée. Toute assistance est très appréciée, mais le problème se pose lorsque j’ajoute une nouvelle classe dérivée de CCLayer et une coche à la bibliothèque statique cocos2d 0.99.5 qui était fausse. Ensuite, je ré-annonce ma classe sans vérifier et nettoyer mes cibles et ensuite construire et aller. Problème résolu maintenant.

1
user366584

Supprimez la cible du panneau de droite et ajoutez à nouveau la cible. Cela supprimera toutes les références en double. Cela peut arriver si 2 programmeurs ajoutent la même cible et valident le fichier de projet.

0
Mayur Kothawade

XCode Beta s'est bloqué lors de la suppression d'une référence à une classe. Cela a causé le problème décrit dans la réponse, le correctif était à nouveau différent.

Dans la phase de construction de ma cible, sous "Compiler les sources", l'élément qui me chagrinait était rouge. Je ne pouvais pas le supprimer avec le bouton Moins, mais taper "ignorer" dans les drapeaux du compilateur fit disparaître la classe rouge après le rechargement du projet. Je suppose que vous pouvez taper n'importe quoi dedans.

Il m'a fallu deux heures pour trouver la solution à mon problème, je l'ai mis ici pour une autre option pour ceux qui ont ce problème, même si ce ne sera probablement pas commun.

0
Dan Power

J'ai eu un projet avec 2 cibles. Une cible nommée Component et la seconde Sample. Sample utilisait Component en tant que bibliothèque de liens . Ensuite, Component utilisait un module nommé MyPod (installé avec cocoapod).

Le podfile a été écrit comme ceci:

def shared_pods
   pod 'MyPod' 
end

target 'Component' do
    shared_pods  
end

target 'Sample' do
    shared_pods
end

Les deux cibles faisaient référence à la liste des pods partagés. Lors de la construction de Component target, aucun problème n'apparaît, mais lors de la création de l'échantillon, un symbole dupliqué est obtenu: _OBJC_METACLASS _ $ _ ClassName .

def shared_pods
    # empty
end

target 'Component' do
   pod 'MyPod'
   shared_pods  
end

target 'Sample' do
    shared_pods
end

Et cela résout le problème ... 3 heures, espère gagner du temps.

0
Romain TAILLANDIER

Dans mon cas, j’utilisais une bibliothèque binaire qui incluait le même nom de classe que j’utilisais à l’extérieur.

0
Abo3atef

Aucune des réponses ne fonctionnait pour moi. J'ai donc supprimé les fichiers du projet et choisi uniquement Supprimer les références.

Ensuite, j'ai rajouté les mêmes fichiers et cela a fonctionné.

Cela a corrigé mon erreur. Peut-être que XCode a des références perdues stockées quelque part puisque le projet est multi-collaboration.

J'espère que ça aide quelqu'un.

0
gmogames

Une autre possibilité d'erreur de ce type existe lorsqu'il y a une collision de nom de classe. Soit 2 classes portant le même nom dans votre projet, soit une classe de votre projet en conflit avec une classe définie dans certaines bibliothèques de dépendances.

0
stoiczek