Doppelte Symbole für die Architektur x86_64 unter Xcode


219

Ich habe jetzt die gleiche Frage mit dem obigen Titel, aber noch nicht die richtige Antwort gefunden. Ich habe den Fehler bekommen:

    /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)

Jede Hilfe wird geschätzt.

Schließlich  finde ich den Grund für diesen Fehler heraus, den ich dem hinzugefügt -ObjChabe Other Linker Flags. Nachdem ich diesen Wert entfernt habe, kann ich mein Projekt erfolgreich erstellen, weiß aber nicht warum. Kann jemand das erklären?


Der Linker ist auf Symbole gestoßen, die mehr als einmal definiert wurden - 75, um genau zu sein. Dies liegt wahrscheinlich daran, dass Sie etwas (wahrscheinlich das MoboSDK, was auch immer das ist) mehr als einmal tun #includeoder #importtun würden.
Ravron

Dieser Fehler tritt auf, nachdem ich ihn GoogleConversionTrackingSDK-iOS-3.0zu meinem Projekt hinzugefügt habe. Davor funktioniert es in Ordnung. Ich habe auch versucht, ihn zu entfernen, aber der Fehler tritt immer noch auf.
Lee

Es ist nicht dein Fall, denn bevor ich das SDK von Google hinzufüge, ist mein Projekt in Ordnung.
Lee

Die zweite Antwort von Adam Waite ist wirklich einfach. Stellen Sie sicher, dass keine .m-Datei # irgendwo importiert ist.
Bogdan

In meinem Fall habe ich versucht, denselben String-Array-Namen in zwei separaten Klassen zu verwenden. Wenn ich den Array-Namen in einer der Klassen geändert habe, wurde dieser Fehler behoben.
Hoffe

Antworten:


109

75 doppelte Symbole für die Architektur x86_64

Bedeutet, dass Sie dieselben Funktionen zweimal geladen haben. Da die Frage verschwindet nach dem Entfernen -ObjCaus , Other Linker Flags, dass diese Option Ergebnis , dass Funktionen Lasten zweimal bedeutet dies:

von Technical Q & A.

Dieses Flag bewirkt, dass der Linker jede Objektdatei in die Bibliothek lädt, die eine Objective-C-Klasse oder -Kategorie definiert. Diese Option führt normalerweise zu einer größeren ausführbaren Datei (aufgrund des in die Anwendung geladenen zusätzlichen Objektcodes). Sie ermöglicht jedoch die erfolgreiche Erstellung effektiver statischer Objective-C-Bibliotheken, die Kategorien für vorhandene Klassen enthalten.

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


1
Stellen Sie mit anderen Worten sicher, dass Sie alle Objektdateien in Ihrem xcode-Projekt entfernen.
Hypothetisch im Schlüsselbein 1.

5
Es funktioniert auch für mich, aber meine anderen Bibliotheken hängen von der -ObjCFlagge ab. Daher muss ich dieses Flag in meinen Projekteinstellungen beibehalten. Könnten Sie bitte eine andere Lösung vorschlagen?
Sunil Targe

3
Ich denke, Sie müssen alle Ihre Bibliotheken überprüfen: Wenn Sie einen doppelten Linker-Fehler erhalten, bedeutet dies, dass Sie denselben Quellcode in zwei oder mehr Bibliotheken haben.
David V

Ich musste einige der React-Bibliotheken entfernen, über die es sich unter Target-> Build Phases-> Link Binary With Libraries in Xcode beschwerte, da dies mit meiner Installation von React
Coty Embry am

In meinem Fall habe ich .m Datei importiert. So ein dummer Fehler. Einmal habe ich die .h-Datei importiert. Es ist fertig zum Bauen !! Vielen Dank
Ravi

261

Für mich hat das Ändern von "Keine gemeinsamen Blöcke" von "Ja" in "Nein" (unter "Ziele"> "Build-Einstellungen"> "Apple LLVM - Codegenerierung") das Problem behoben.


3
Dies löste mein Problem. Muss es jemals wieder geändert werden NO? Was ist der Grund dafür?
Hemang

3
Ja, dies löst das Problem, aber nicht den Grund dafür. Wenn Sie eine Konstante definiert haben, stellen Sie sicher, dass die Definition in Ordnung ist. In meinem Fall habe ich einfach "extern" vergessen. Dies wird in der Antwort von Sauvik Dolui erwähnt.
Coco

10
Xcode 8 veranlasste diese Änderung als eines seiner automatischen Updates und brach meinen Build: /
pkamb

1
Nach 2 Stunden wurde dieses Problem aufgrund dieser Antwort behoben. Vielen Dank
Manish Pathak

1
Das funktioniert, aber ich musste es in Ziel und Projekt
ändern

251

Dumm, aber stellen Sie sicher, dass Sie nicht versehentlich irgendwo #importeine .mDatei bearbeitet haben


3
Ich hatte dies nicht getan, aber diese Lösung half mir zu finden, was ich getan hatte, nämlich versehentlich eine Variable außerhalb des @ interface-Blocks in einer .h-Datei zu deklarieren.
Roller

Bei Verwendung von Komponententests wird nur die .m-Datei generiert. Ich habe eine Header-Datei dafür erstellt, obwohl ich denke, dass dies nicht die beste Lösung ist - ich wollte eine Basistestklasse erstellen.
Bruno Muniz

Vielen Dank, dass Sie meinen Verstand für die Möglichkeit aufgeklärt haben, dass ich einen so dummen Fehler gemacht habe.
Daniel Lima

Wie wäre es mit einem projektübergreifenden Import einer .m-Datei?
Noveleven

54

In meinem Fall habe ich gerade eine Header-Datei erstellt, um konstante Zeichenfolgen wie folgt zu definieren:

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

Ich habe dieses Szenario gelöst mit static:

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

2
Dies löste das Problem für mich. Obwohl ich externanstelle von vorangestellt habe static: extern NSString * const kNotificationName;. Was seltsam ist, weil du normalerweise kein solches Präfix
hinzugefügt hast

Dies löste aus irgendeinem Grund mein Problem. Vielen Dank. Ich verstehe nicht, warum der Compiler keine bessere Antwort geben konnte als doppelte Symbole, die überhaupt nicht verwandt zu sein scheinen.
Sirenen

@ Sirens, ich habe auch eine bessere Fehlermeldung vom LLVM-Compiler erwartet. Jedenfalls hatte ich das Glück, den Fehler nach 2 Tagen herauszufinden. :(
Sauvik Dolui

Das war auch mein Problem. Warum wird das eigentliche Problem dadurch verursacht?
Fatlad

Dies ist in Ordnung, wenn alle Variablen in AppStrings.hKonstanten sind. Wenn Sie jedoch eine globale veränderbare Variable möchten, führt dies zu Chaos, da jede Quelldatei, die die Header-Datei enthält, eine eigene Kopie der Variablen hat. Es ist eine schlechte Lösung.
Trojaner

32

Ich fand, dass die akzeptierte Antwort das Problem berührt, half mir aber nicht, es zu lösen. Hoffentlich hilft diese Antwort bei diesem sehr frustrierenden Problem.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"Bedeutet, dass Sie dieselben Funktionen zweimal geladen haben. Da das Problem nach dem Entfernen von -ObjC aus anderen Linker-Flags verschwindet, bedeutet dies, dass diese Option dazu führt, dass Funktionen zweimal geladen werden:"

Für Laien bedeutet dies, dass wir in unserem Projekt zwei Dateien mit genau demselben Namen haben. Vielleicht kombinieren Sie ein Projekt in ein anderes? Schauen Sie sich die Fehler über dem Fehler "Symbole duplizieren" an, um festzustellen, welcher Ordner dupliziert wurde. In meinem Fall war es BLoginViewController.

In der Abbildung unten sehen Sie beispielsweise, dass ich zwei BImageViewController habe. Für mich war dies der Grund für das Problem.

Sobald ich eine gelöscht habe, ist das Problem verschwunden :)

Geben Sie hier die Bildbeschreibung ein


2
Riesige Hilfe, danke. Ich habe ein Backup eines Projekts erstellt, das Cocoapods verwendet. Um zu vergessen, dass ich den Arbeitsbereich öffnen musste, als ich das Backup in Xcode neu lud und feststellte, dass es nicht erstellt werden konnte, fügte ich AFNetworking direkt zum Projekt hinzu. Anschließend habe ich meine Cocoapods neu eingerichtet, einschließlich AFNetworking als Abhängigkeit, und vergessen, den ursprünglichen AFNetworking-Ordner zu entfernen, den ich meinem Projekt hinzugefügt hatte.
Januar

32

Ich habe das gleiche Problem. In Xcode 7.2 unter Pfad Projektziel> Build-Einstellung> Keine gemeinsamen Blöcke ändere ich es in NEIN.


4
Das war mein Problem. Es war eine Einstellung, die Xcode 8 vorgenommen hatte. Vielen Dank!
Robert J. Clegg

30

Passiert auch, wenn Sie const-Variablen mit demselben Namen in verschiedenen Klassen deklarieren:

in der Datei Message.m

const int kMessageLength = 36;

@implementation Message

@end

in der Datei Chat.m

const int kMessageLength = 20;

@implementation Chat

@end

1
Nicht const, aber es hat bei mir funktioniert, wenn ich den Variablennamen ändere
Oktay

Ich hatte dies mit einem Zeiger meiner eigenen Klassenvariablen definiert in der Implementierung von zwei verschiedenen Klassen
Ammianus

Zur Kompilierungszeit sucht der Compiler nur in Header-Dateien (.h) nach doppelten Symbolen (hier globale Variablen). Aber zum Zeitpunkt der Verknüpfung werden auch die (globalen) Variablen in den Implementierungsdateien (.m) überprüft, und wenn es Duplikate gibt, wird Linker durch Fehler: Duplikatsymbol _xyz
PANKAJ VERMA

30

Dies trat bei mir auf, als ich das Popup "Empfohlene Einstellungen" für ein Projekt akzeptierte, das ich vor zwei Jahren in Objective-C entwickelt hatte.

Das Problem war, dass Xcode beim Akzeptieren des Updates "Empfohlene Einstellungen" automatisch einige Build-Einstellungen änderte oder hinzufügte, einschließlich GCC_NO_COMMON_BLOCKS = YES;.

Dies führte dazu, dass der Build mit dem duplicate symbolFehler in meinem aktualisierten Projekt fehlschlug . Also habe ich geändert , No Common Blockum NOin meinen Build - Einstellungen und der Fehler weg.


3
Ja, das hat mir geholfen. Xcode 8 hat ein älteres Projekt auf die empfohlenen Einstellungen aktualisiert. Schaltete dies zurück und ich bin gut, um wieder zu gehen. Vielen Dank!
Zoltán

2
Gut gemacht. Hat mir viel geholfen! Eine gute Abstimmung für dich Liebling! ;-)
Helen Wood


16

Der schnellste Weg, um das Duplikat zu finden, ist:

  1. Gehen Sie zu Ziele
  2. Gehen Sie zu Phasen erstellen
  3. Gehen Sie zu Quellen kompilieren
  4. Löschen Sie doppelte Dateien.

Omg, das war mein Fall, vielen Dank! Jetzt schulde ich dir 4 Stunden meines Lebens und etwas Bier :)
Miroslav

1
Gern geschehen, aber nein danke, ich trinke nicht :) Viel Spaß beim Codieren.
J. Goce

Fügen Sie dem noch ein paar Stunden hinzu.
CJ_COIMBRA

Hat für mich gearbeitet! Danke dir!
redolent

15

Die folgenden Schritte haben das Problem für mich gelöst.

  1. Gehen Sie in den Zieleinstellungen zu Phasen erstellen.
  2. Gehen Sie zu „Binär mit Bibliotheken verknüpfen“.
  3. Überprüfen Sie, ob eine der Bibliotheken zweimal vorhanden ist.
  4. Bauen Sie erneut.

13

Entfernen Sie -ObjC aus anderen Linker-Flags oder überprüfen Sie, ob Sie versehentlich eine .m-Datei anstelle von .h importiert haben.


1
Hey, alle, die sich immer noch fragen, warum -ObjC-Flag nicht funktioniert - achten Sie auf diese Antwort. Ich habe völlig falsch gedacht - Die ABjC-Flagge funktioniert in meinem "Super-Special" -Fall nicht. Nachdem .m"ich das Projekt nach etw durchsucht habe, habe ich festgestellt, dass ich eine .m-Datei anstelle von .h importiert habe und nachdem ich behoben habe, dass es einfach funktioniert hat! Talk is cheap, show me the code!Prost!
Bgplaya

9

Meine Situation mit einem in Xcode 7.3 eröffneten Legacy-Projekt war:

duplicate symbol _SomeEnumState in:

gefolgt von einer Liste von zwei nicht verwandten Dateien.o, dann wurde dies einige Male wiederholt, dann schließlich:

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

Was es für mich gelöst hat, war die Änderung der Aufzählungserklärung von:

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

dazu:

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

Wenn jemand eine Erklärung dafür hat, klären Sie mich bitte auf.


Das Gleiche hat es für mich behoben, als ich enum auf typedef NS_ENUM umgestellt habe, hat es den Fehler mit doppelten Symbolen
behoben

9

Das Definieren derselben Variablen unter @implementation in mehr als einer Klasse kann ebenfalls dieses Problem verursachen.


aber wieso? Das gleiche passierte mir mit einfachen C-Funktionen mit den gleichen Namen
Vib

9

In meinem Fall befanden sich zwei gleichnamige Dateien am Speicherort

Ziele> Phasen erstellen> Quellen kompilieren und doppelte Dateien löschen.


8
  • Gehen Sie zu Ziele
  • Wählen Sie Build Settings
  • Suche nach „Keine gemeinsamen Blocks“ , wählen Sie es auf NO .

Es hat bei mir funktioniert


7

Dieses Problem trat nach der Installation von Cocoapods auf. Jetzt passiert jedes Mal, wenn ich einige Pods aktualisiere. Lösung, die ich gefunden habe:

Zum Terminal gehen:

1) pod deintegrate
2) pod install

Überprüfen Sie außerdem den Punkt "Schnelle Bibliotheken immer einbetten" in Ihren Build-Einstellungen. Es sollte "verblasst" sein, um anzuzeigen, dass die Standardkonfiguration verwendet wird. Wenn es auf ein manuelles JA eingestellt ist, klicken Sie auf Löschen, um es auf die Standardkonfiguration zurückzusetzen. Dies stoppte das Verhalten.


Das hat bei mir funktioniert. "Always Embed Swift Libraries" wurde jedoch bereits auf NO gesetzt. Ich habe es auf YES umgestellt und dann auf Löschen geklickt und dann die oben angegebenen Pod-Funktionen ausgeführt.
BVB09

5

Für mich während der von Xcode8 empfohlenen Projekteinstellungen aktualisieren Sie "No Common Blocks" auf YES, was dieses Problem verursacht.


Gleiches gilt hier für Xcode8.2.1, wenn es auf ein altes Projekt angewendet wird.
Onekiloparsec

Dies hat es auch auf XCode 11.3.1 behoben
LowFieldTheory

5

Heute habe ich den gleichen Fehler bekommen. Das Schlüsselwort des Fehlers ist duplicate. Ich behebe es durch:

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 :

Referenz entfernen

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

Vielen Dank! In meinem Fall habe ich zwei main.m zusammengestellt, wobei eine die alte Referenz war. Dies wurde durch Drag & Drop verursacht.
Tong

4

Stellen Sie sicher, dass Sie nicht versehentlich eine .m-Datei importiert haben. Möglicherweise möchten Sie Ihre abgeleiteten Daten im Projektfenster löschen und anschließend erstellen und erneut ausführen.


4

Für alle anderen, die dieses Problem haben, habe ich meine Lösung in keiner dieser Antworten gesehen.

Nach einem .pbxproj-Zusammenführungskonflikt, der manuell behoben wurde (wenn auch nur unzureichend), gab es im .pbxproj doppelte Verweise auf einzelne Klassendateien. Das Löschen dieser aus dem Projekt> Phasen erstellen> Quellen kompilieren hat alles für mich behoben.

Hoffe, das hilft jemandem auf der ganzen Linie.


hatte auch Zusammenführungskonflikte und musste sie manuell in der Datei pbxproj lösen. Endete mit ld: X duplicate symbols for architecture x86_64. Es wurde behoben, indem die in der Fehlermeldung genannten Quelldateien entfernt und erneut zum Projekt hinzugefügt wurden.
Kas-Kad

4

Ähnlich wie bei Juice007 hatte ich eine Variable vom Typ C in zwei verschiedenen .m-Dateien deklariert und initialisiert (die nicht importiert wurden!).

BOOL myVar = NO;

Diese Methode zum Deklarieren und Initialisieren einer Variablen, selbst in .m, selbst in @implementation, gewährt ihr jedoch globalen Geltungsbereich. Ihre Optionen sind:

  1. Deklarieren Sie es als statisch, um den Bereich auf die Klasse zu beschränken:

    static BOOL myVar = NO;
  2. Entfernen Sie die Initialisierung (wodurch die beiden Klassen die globale Variable gemeinsam nutzen):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. Deklarieren Sie es als eine Eigenschaft:

    @property BOOL myVar;
  4. Deklarieren Sie es als richtiges iVar in der @ Schnittstelle

    @interface myClass(){
        BOOL myVar;
    }
    @end

4

In meinem Fall hatte ich zwei main()Methoden in meinem Projekt definiert und das Entfernen einer löste das Problem.


Hatte hier das gleiche Problem. Dein Beitrag hat mir geholfen. Vielen Dank!
Baran Emre

3

Vor kurzem hatte ich Kopfschmerzen bei der Suche nach einer Fehlerquelle. Ich habe mich gefragt, als ich herausfand, dass meine App nicht kompiliert werden möchte, einfach weil ich in verschiedenen Klassen folgendes Code-Snippet hatte:

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;
}

Hoffe das könnte jemandem helfen.


kleine Hilfsfunktion, versehentlich kopiert, leicht übersehen - danke!
Steven A. Lowe

3

Ich hoffe es wird dir definitiv helfen

Ich habe den gleichen Fehler 3 doppelte Symbole für die Architektur x86_64

In meinem Fall habe ich Code aus einer anderen Datei desselben Projekts kopiert, z. Code der Am-Datei zu Bm und nach der Kompilierung bekam ich einen Fehler als Erwähnung. und ich habe Fehler durch Ändern des Namens der globalen Variablen gelöst.

Dieser Fehler trat in meinem Fall aufgrund der gleichen Deklaration für die globale Variable in beiden Dateien auf.


3

Ich habe den gleichen Fehler erhalten, als ich ein Pod-Repository hinzugefügt habe

pod 'SWRevealViewController'

für einen bereits hinzugefügten Quellcode (SWRevealViewController) von gitHub. Der Fehler wird also behoben, indem entweder der Quellcode oder das Pod-Repository entfernt werden.

Fall 2:

Beim zweiten Mal trat dieser Fehler auf, als ich eine Konstante in der .h- Datei deklarierte .

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...

Fall 2 hat mir eine Nacht gerettet. Vielen Dank!
Pankaj Yadav

3

Die obigen Antworten haben bei mir nicht funktioniert. So bin ich darum herumgekommen:

1) Löschen Sie im Finder den gesamten Pods-Ordner und die Podfile.lock-Datei. 2) Schließen Sie das xcode-Projekt. 3) Führen Sie die Pod-Installation im Terminal aus. 4) Öffnen Sie das xcode-Projekt und führen Sie den Befehl clean build aus

Hat danach für mich gearbeitet.


2

Das gleiche Problem tritt bei mir auf, als ich das Lob-Projekt in mein Projekt integriert habe.

Geben Sie hier die Bildbeschreibung ein

Eigentlich hat lob project auch die AFNetworking-Dateien, also entferne ich die .m-Dateien aus lob lob.

Geben Sie hier die Bildbeschreibung ein

Tatsächlich stehen .m-Dateien in Konflikt mit den POd / AFNetworking / .m-Dateien meines Projekts

Geben Sie hier die Bildbeschreibung ein


2

In Xcode 6.3.2. Ich habe alle Möglichkeiten wie unten geprüft

1: Ich habe keine .m-Datei in mein Projekt importiert.

2: -ObjCVom Flag "Anderer Linker" entfernt .

3: Alle meine abgeleiteten Daten wurden entfernt .

Trotzdem bekomme ich den gleichen Fehler. Ich habe diesen Fehler behoben, indem ich eine Variablendeklaration aus der .pchDatei entfernt habe . In meinem Fall habe ich AppDelegateObjekt in .pchDatei deklariert . Endlich habe ich einen Grund gefunden, der einen Fehler verursacht. Also entferne ich die Deklaration einer Variablen aus der PCH-Datei und den Charme meines Projekts.


2

Ein weiterer dummer Fehler, der diesen Fehler verursacht, sind wiederholte Dateien. Ich habe versehentlich einige Dateien zweimal kopiert. Zuerst ging ich zu Ziele -> Phasen erstellen -> Quellen kompilieren. Dort habe ich einige Dateien auf dieser Liste zweimal und ihre Speicherorte bemerkt.


Ich weiß nicht, warum dich jemand herabgestimmt hat, das hat mein Problem gelöst.
Yawar

2

Ich habe heute auch diesen Fehler. Das liegt daran, dass ich einen .mkonstanten Wert in einer Datei definiert habe. Aber ich habe eine andere .mDatei definiert , die auch diesen konstanten Wert enthält. Das bedeutet, dass sie zwei gleiche konstante Werte hat. Dieser Fehler tritt also auf. Und meine Lösung ist das Hinzufügen eines Schlüsselworts " static" vor dem const-Wert.

static CGFloat const btnConunt = 9;

Und dann baue ich das Projekt, es wird diesen Fehler nicht melden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.