Symboles en double pour l'architecture x86_64 sous Xcode

219

J'ai maintenant la même question avec le titre ci-dessus mais je n'ai pas encore trouvé la bonne réponse. J'ai eu l'erreur:

    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
duplicate symbol _OBJC_METACLASS_$_MoboSDK in:
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
ld: 75 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Toute aide est appréciée.

Enfin,  je trouve la raison de cette erreur, car j'ai ajouté -ObjCà la Other Linker Flags. Après avoir supprimé cette valeur, je peux créer mon projet avec succès, mais je ne sais pas pourquoi. Quelqu'un peut-il expliquer cela?

Lee
la source
L'éditeur de liens a rencontré des symboles définis plus d'une fois - 75, pour être exact. Ceci est probablement parce que vous #include« d ou #import» d quelque chose (probablement le MoboSDK, quelle qu'elle soit) plus d'une fois.
ravron le
cette erreur se produit après avoir ajouté GoogleConversionTrackingSDK-iOS-3.0à mon projet.Avant cela, cela fonctionne bien.J'ai également essayé de le supprimer, mais l'erreur persiste.
Lee
ce n'est pas votre cas, car avant d'ajouter le sdk de google, mon projet est ok.
Lee
La deuxième réponse d'Adam Waite est très simple. Assurez-vous qu'aucun fichier .m n'est importé quelque part.
Bogdan
Dans mon cas, j'essayais d'utiliser le même nom de tableau de chaînes dans deux classes distinctes. Lorsque j'ai changé le nom du tableau dans l'une des classes, cette erreur a été supprimée.
Hope

Réponses:

109

75 symboles en double pour l'architecture x86_64

Signifie que vous avez chargé deux fois les mêmes fonctions. Comme la question disparaît après le retrait -ObjCde Other Linker Flags, ce moyen que ce résultat de l' option que les charges de fonctions deux fois:

de Technical Q&A

Cet indicateur oblige l'éditeur de liens à charger chaque fichier objet de la bibliothèque qui définit une classe ou une catégorie Objective-C. Bien que cette option se traduise généralement par un plus grand exécutable (en raison du code d'objet supplémentaire chargé dans l'application), elle permettra la création réussie de bibliothèques statiques Objective-C efficaces qui contiennent des catégories sur les classes existantes.

https://developer.apple.com/library/content/qa/qa1490/_index.html

David V
la source
1
En d'autres termes, assurez-vous de supprimer tous les fichiers objets de votre projet xcode.
Hypothétique dans la clavicule
5
Cela fonctionne aussi pour moi aussi, mais mes autres bibliothèques dépendent du -ObjCdrapeau. Je dois donc avoir besoin de conserver cet indicateur dans les paramètres de mon projet. Pourriez-vous donc suggérer une autre solution?
Sunil Targe
3
Je suppose que vous devez revoir toutes vos bibliothèques: si vous obtenez une erreur de l'éditeur de liens en double, cela signifie que vous avez le même code source dans 2 bibliothèques ou plus.
David V
J'ai dû supprimer certaines des bibliothèques React dont il se plaignait sous Target-> Build Phases-> Link Binary With Libraries in Xcode car il était en conflit avec l'installation de React
Coty Embry le
Dans mon cas, j'ai importé un fichier .m. Erreur si stupide. Une fois que j'ai importé le fichier .h. Il est prêt à construire !! Merci
Ravi
261

Pour moi, changer 'No Common Blocks' de Yes en No (sous Targets-> Build Settings-> Apple LLVM - Code Generation) a résolu le problème.

Linda MacPhee-Cobb
la source
3
Cela a résolu mon problème. Est-il jamais nécessaire de le remplacer NO? Quelle est la raison derrière cela?
Hemang
3
Oui, cela résout le problème, mais pas la raison derrière cela. Si vous avez défini une const, assurez-vous que la définition est correcte. Dans mon cas, j'ai simplement oublié "extern". Ceci est mentionné dans la réponse de Sauvik Dolui.
coco
10
Xcode 8 a incité à ce changement comme l'une de ses mises à jour automatiques et a cassé ma version: /
pkamb
1
Après avoir passé 2 heures, ce problème a été résolu grâce à cette réponse. Merci
Manish Pathak
1
Cela fonctionne, mais je devais le changer dans la cible et le projet
Nooblhu
251

Stupide, mais assurez-vous que vous n'avez pas #importédité un .mfichier par erreur quelque part

Adam Waite
la source
3
Je ne l'avais pas fait, mais cette solution m'a aidé à trouver ce que j'avais fait qui était de déclarer une variable en dehors du bloc @interface dans un fichier .h par erreur.
Scooter
Lorsque vous utilisez des tests unitaires, seul le fichier .m est généré. J'ai créé un fichier d'en-tête malgré je suppose que ce n'est pas la meilleure solution - je voulais créer une classe de test de base.
Bruno Muniz
Merci beaucoup d'avoir éclairé mon esprit sur la possibilité que j'ai fait une erreur aussi stupide.
Daniel Lima
que diriez-vous du fichier .m d'importation croisée?
noveleven
54

Dans mon cas, je viens de créer un fichier d'en-tête pour définir des chaînes constantes comme ceci:

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

J'ai résolu ce scénario en utilisant static:

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";
Sauvik Dolui
la source
2
cela a résolu le problème pour moi. Bien que je préfixés au externlieu de static: extern NSString * const kNotificationName;. Ce qui est étrange, car généralement, vous n'avez pas ajouté un tel préfixe, et cela a bien fonctionné.
user1244109
Cela, pour une raison quelconque, a résolu mon problème. Merci. Je ne comprends pas pourquoi le compilateur n'a pas pu donner une meilleure réponse que les symboles en double, qui ne semblent pas du tout liés.
Sirens
@Sirens, je m'attendais également à un meilleur message d'erreur du compilateur LLVM. Quoi qu'il en soit, j'ai eu la chance de découvrir l'erreur après 2 jours. :(
Sauvik Dolui
c'était mon problème aussi, pourquoi le problème est-il réellement causé par cela?
Fatlad
C'est très bien si toutes les variables dans AppStrings.hsont des constantes, mais cela causera des havok si vous voulez une variable mutable globale car chaque fichier source qui inclut le fichier d'en-tête aura sa propre copie de la variable. C'est une mauvaise solution.
trojanfoe
32

J'ai trouvé que la réponse acceptée touche au problème mais ne m'a pas aidé à le résoudre, j'espère que cette réponse aidera à résoudre ce problème très frustrant.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"Signifie que vous avez chargé deux fois les mêmes fonctions. Comme le problème disparaît après la suppression de -ObjC des autres indicateurs de l'éditeur de liens, cela signifie que cette option a pour résultat que les fonctions se chargent deux fois:"

En termes simples, cela signifie que nous avons deux fichiers dans notre projet avec exactement le même nom. Peut-être que vous combinez un projet dans un autre? Jetez un œil aux erreurs au-dessus de l'erreur "symboles en double" pour voir quel dossier est dupliqué, dans mon cas c'était BLoginViewController.

Par exemple, dans l'image ci-dessous, vous pouvez voir que j'ai deux BImageViewControllers, pour moi, c'est ce qui causait le problème.

Dès que j'en ai supprimé un, le problème a disparu :)

entrez la description de l'image ici

simon_smiley
la source
2
Une aide énorme, merci. J'ai pris une sauvegarde d'un projet qui utilise des cocoapods. En oubliant que je devais ouvrir l'espace de travail lorsque j'ai rechargé la sauvegarde dans Xcode et constaté qu'elle ne pouvait pas être construite, j'ai ensuite ajouté AFNetworking directement au projet. J'ai ensuite reconfiguré mes cocoapods, qui comprenaient AFNetworking en tant que dépendance et j'ai oublié de supprimer le dossier AFNetworking d'origine que j'avais ajouté à mon projet.
JanB
32

J'ai le même problème. Dans Xcode 7.2 dans le chemin Project Target> Build Setting> No Common Blocks, je le change en NO.

Dr chamran
la source
4
C'était mon problème. C'était un paramètre que Xcode 8 avait mis. Merci!
Robert J.Clegg
30

Se produit également lorsque vous déclarez des variables const avec le même nom dans une classe différente:

dans le fichier Message.m

const int kMessageLength = 36;

@implementation Message

@end

dans le fichier Chat.m

const int kMessageLength = 20;

@implementation Chat

@end
Luca Davanzo
la source
1
Pas const mais cela a fonctionné pour moi quand je change le nom de variable
Oktay
J'ai eu cela avec un pointeur de ma propre variable de classe définie dans la @implementation de deux classes différentes
ammianus
Au moment de la compilation, le compilateur recherche les symboles en double (ici les variables globales) uniquement dans les fichiers d'en-tête (.h). Mais au moment de la liaison, les variables (globales) dans les fichiers d'implémentation (.m) sont également vérifiées et s'il y a un doublon, Linker par erreur: symbole en double _xyz
PANKAJ VERMA
30

Cela s'est produit lorsque j'ai accepté la fenêtre contextuelle "Paramètres recommandés" sur un projet que j'ai développé il y a deux ans dans Objective-C.

Le problème était que lorsque vous avez accepté la mise à jour des "paramètres recommandés", Xcode a automatiquement modifié ou ajouté certains paramètres de build, notamment GCC_NO_COMMON_BLOCKS = YES;.

Cela a fait échouer la construction avec l' duplicate symbolerreur dans mon projet mis à jour. J'ai donc changé No Common Blockpour NOdans mes paramètres de construction et l'erreur a disparu.

Blaszard
la source
3
Ouais, ça m'a aidé. Xcode 8, a mis à jour un ancien projet avec les paramètres recommandés. Je suis revenu sur ce coup et je suis prêt à recommencer. Merci!
Zoltán
2
Bon travail. M'a beaucoup aidé! Un vote pour toi chérie! ;-)
Helen Wood
1
Brilliant mate :)
Burf2000
16

Le moyen le plus rapide de trouver le doublon est:

  1. Aller aux cibles
  2. Aller aux phases de construction
  3. Allez dans Compiler les sources
  4. Supprimez les fichiers en double.
J. Goce
la source
Omg, c'était mon cas, merci beaucoup! Maintenant, je vous dois 4 heures de ma vie et de la bière :)
Miroslav
1
vous êtes les bienvenus, mais non merci je ne bois pas :) codage heureux.
J. Goce
Ajoutez quelques heures de plus à cela.
CJ_COIMBRA
A travaillé pour moi! Je vous remercie!
refait le
15

Les étapes suivantes ont résolu le problème pour moi.

  1. Accédez à Build Phases dans Target settings.
  2. Allez dans «Lier le binaire aux bibliothèques».
  3. Vérifiez si l'une des bibliothèques existe deux fois.
  4. Construisez à nouveau.
Pigeon
la source
13

Supprimez -ObjC des autres indicateurs de l'éditeur de liens ou vérifiez par erreur que vous avez importé un fichier .m au lieu de .h.

CKR666
la source
1
Hé, tout le monde, qui se demande toujours pourquoi le drapeau -ObjC ne fonctionne pas - faites attention à cette réponse. J'avais complètement tort de penser que le drapeau -ObjC ne fonctionne pas dans mon cas "super spécial". Après avoir parcouru le projet pour smth comme .m"j'ai remarqué que j'ai importé un fichier .m au lieu de .h et après avoir corrigé cela a juste fonctionné! Talk is cheap, show me the code!À votre santé!
bgplaya
9

Ma situation avec un projet hérité ouvert dans Xcode 7.3 était:

duplicate symbol _SomeEnumState in:

suivi d'une liste de deux fichiers non liés.o, puis cela a été répété plusieurs fois, puis finalement:

ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ce qui a résolu le problème en changeant la déclaration d'énumération:

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;

pour ça:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};

Si quelqu'un a une explication à cela, veuillez m'éclairer.

tadija
la source
La même chose l'a corrigé pour moi, lorsque j'ai basculé enum sur typedef NS_ENUM, cela a corrigé l'erreur des symboles en double
Mark24x7
9

La définition de la même variable sous @implementation dans plusieurs classes peut également provoquer ce problème.

Shree
la source
mais pourquoi? la même chose m'est arrivée avec des fonctions C simples avec les mêmes noms
vib
9

Dans mon cas, il y avait deux fichiers du même nom à l'emplacement

Cibles> Phases de construction> Compiler les sources et supprimer tous les fichiers en double.

Nij
la source
8
  • Aller aux cibles
  • Sélectionnez les paramètres de construction
  • Recherchez "No Common Blocks" , sélectionnez-le sur NO .

Ça a marché pour moi

Deepak Sasindran
la source
7

J'ai rencontré ce problème après l'installation des Cocoapods. Cela se produit maintenant chaque fois que je mets à jour certains modules. Solution que j'ai trouvée:

Accédez au terminal:

1) pod deintegrate
2) pod install

Vérifiez également l'élément "Toujours intégrer les bibliothèques Swift" dans vos paramètres de génération. Il doit être "décoloré" pour indiquer qu'il utilise la configuration par défaut. S'il est défini sur OUI manuel, appuyez sur supprimer pour le restaurer à la configuration par défaut. Cela a arrêté le comportement.

TDesign
la source
Cela a fonctionné pour moi. Cependant, "Always Embed Swift Libraries" était déjà défini sur NO. Je l'ai basculé sur OUI, puis j'ai appuyé sur Supprimer, puis j'ai exécuté les fonctions du pod indiquées ci-dessus.
BVB09
5

Pour moi, pendant la mise à jour des paramètres de projet recommandés par Xcode8, "No Common Blocks" sur YES, ce qui provoque ce problème.

Naveen Shan
la source
Idem ici pour Xcode8.2.1, lorsqu'il est appliqué à un ancien projet.
onekiloparsec
Cela l'a également corrigé sur XCode 11.3.1
LowFieldTheory
5

Aujourd'hui, j'ai eu la même erreur. Le mot clé de l'erreur est duplicate. Je le répare en:

1. Remove the duplicate file at Build Phases-->Compile Sources
2. If you can not remove it at Build Phases, you need find the file at your project and remove the reference by DELETE :

supprimer la référence

3. Add the file to your project again
4. Add the file's .m to your Build Phases-->Compile Sources again
5. Build your project, the error will disappear
guozqzzu
la source
Merci! Dans mon cas, j'ai compilé deux main.m où l'un était l'ancienne référence. Cela était dû au glisser-déposer.
tong
4

Assurez-vous que vous n'avez pas importé un fichier .m par accident, vous souhaiterez peut-être supprimer vos données dérivées dans la fenêtre Projets, puis générer et réexécuter.

JohnVanDijk
la source
4

Pour toute autre personne qui rencontre ce problème, je n'ai vu ma résolution dans aucune de ces réponses.

Après avoir rencontré un conflit de fusion .pbxproj qui a été résolu manuellement (quoique mal), il y avait des références en double aux fichiers de classe individuels dans le .pbxproj. La suppression de ceux du projet> phases de construction> sources de compilation a tout résolu pour moi.

J'espère que cela aidera quelqu'un sur toute la ligne.

dépenses
la source
a également eu des conflits de fusion et a dû les résoudre manuellement dans le fichier pbxproj. J'ai fini avec ld: X duplicate symbols for architecture x86_64. Corrigé en supprimant les fichiers source mentionnés dans le message d'erreur et en les rajoutant à nouveau au projet.
kas-kad
4

Similaire à Juice007, j'avais déclaré et initialisé une variable de type C dans deux fichiers .m différents (qui n'étaient pas importés!)

BOOL myVar = NO;

cependant, cette méthode de déclaration et d'initialisation d'une variable, même en .m, même en @implementation, lui confère une portée globale. Vos options sont:

  1. Déclarez-le comme statique, pour limiter la portée à la classe:

    static BOOL myVar = NO;
  2. Supprimez l'initialisation (ce qui fera que les deux classes partagent la var globale):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. Déclarez-le comme une propriété:

    @property BOOL myVar;
  4. Déclarez-le comme un iVar approprié dans @interface

    @interface myClass(){
        BOOL myVar;
    }
    @end
Mars
la source
4

Dans mon cas, j'avais deux main()méthodes définies dans mon projet et en supprimer une a résolu le problème.

Pradeep Kumar Kushwaha
la source
Eu le même problème ici. Votre message m'a aidé. Merci!
Baran Emre
3

J'ai récemment eu mal à la tête à la recherche d'une source d'erreur. Je me suis demandé, quand j'ai découvert que mon application ne voulait pas compiler, simplement parce que j'avais l'extrait de code suivant dans différentes classes:

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;


    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);

    return milestone;
}

J'espère que cela pourrait aider quelqu'un.

Evgeniy Kleban
la source
petite fonction d'aide, copiée accidentellement, facilement négligée - merci!
Steven A. Lowe
3

J'espère que cela vous aidera certainement

J'ai la même erreur 3 symboles en double pour l'architecture x86_64

dans mon cas, j'ai copié du code à partir d'un autre fichier du même projet, par exemple. code du fichier Am à Bm et après la compilation, j'ai eu une erreur comme mention. et j'ai résolu l'erreur en changeant le nom de la variable globale.

cette erreur est venue dans mon cas à cause de la même déclaration pour la variable globale dans les deux fichiers.

Bhupendrasingh Lohar
la source
3

J'ai la même erreur lorsque j'ai ajouté un référentiel de pod

pod 'SWRevealViewController'

pour un code source déjà ajouté (SWRevealViewController) de gitHub. Ainsi, l'erreur sera corrigée en supprimant le code source ou le référentiel pod.

Cas n ° 2:

La 2ème fois, cette erreur est apparue lorsque je déclare une constante dans le fichier .h .

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...
Zeeawan
la source
Le deuxième cas m'a sauvé une nuit. Merci!
Pankaj Yadav du
3

Les réponses ci-dessus n'ont pas fonctionné pour moi. Voici comment je l'ai contourné:

1) dans le Finder, supprimez l'intégralité du dossier Pods et du fichier Podfile.lock 2) fermez le projet xcode 3) exécutez l'installation de pod dans le terminal 4) ouvrez le projet xcode, exécutez la commande clean build

A travaillé pour moi après ça.

Faye Hayes
la source
2

Le même problème se produit avec moi, lorsque j'intégrais le projet lob dans mon projet.

entrez la description de l'image ici

En fait, le projet lob a également les fichiers AFNetworking, donc je supprime les fichiers .m du projet lob.

entrez la description de l'image ici

En fait, les fichiers .m sont en conflit avec les fichiers POd / AFNetworking / .m de mon projet

entrez la description de l'image ici

abdulrauf618
la source
2

Dans Xcode 6.3.2. J'ai vérifié toutes les possibilités comme ci-dessous

1: Je n'ai pas importé de fichier .m dans mon projet.

2: supprimé -ObjCde l' indicateur Autre éditeur de liens .

3: Suppression de toutes mes données dérivées .

je reçois toujours la même erreur. J'ai supprimé cette erreur en supprimant toute déclaration de variable du .pchfichier . dans mon cas, j'ai déclaré l' AppDelegateobjet dans le .pchfichier. enfin j'ai trouvé la raison de cette erreur. donc je supprime la déclaration de toute variable du fichier .pch et mon charme de travail de projet.

Jatin Patel - JP
la source
2

Une autre erreur stupide qui provoquera cette erreur est la répétition des fichiers. J'ai accidentellement copié deux fichiers deux fois. Je suis d'abord allé dans Targets -> Build Phases -> Compile sources. Là, j'ai remarqué deux fichiers sur cette liste et leurs emplacements.

Andrew McKinley
la source
Je ne sais pas pourquoi quelqu'un a voté contre, cela a résolu mon problème.
Yawar
2

J'ai également cette erreur aujourd'hui, car j'ai défini une valeur const dans un .mfichier, mais j'ai défini un autre .mfichier qui comprenait également cette valeur const, ce qui signifie qu'il a deux mêmes valeurs const.Cette erreur apparaît. Et ma solution consiste à ajouter un mot clé " static" avant la valeur const.tels que:

static CGFloat const btnConunt = 9;

Et puis je construis le projet, il ne signalera pas cette erreur.

Juice007
la source