2014-12-12 18 views
5

Ich bin neu in Xcode und wenn ich den folgenden Code (ein MWE) bauen, bekomme ich folgende FehlerXcode C++ :: Doppelte Symbole für Architektur x86_64

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

Ich habe drei Dateien wie folgt;

main.cpp

#include "B.cpp" 
int main() { 
    square(5); 
    return 0; 
} 

B.cpp

#include "A.cpp" 

void square(int n){ 
    display(n*n); 
} 

A.cpp

#include <iostream> 
using namespace std; 

void display(int num){ 
    cout<<num; 
} 

ich verschiedene Methoden erwähnt auf Stack-Überlauf wie Änderung versucht haben, "Aktiv Architektur Bauen Only" auf "Ja" und einige andere, aber der Fehler immer noch besteht fort.

Antwort

10

Problem ist, dass main.cppB.cpp und A.cpp enthalten hat. In Ihrem Build-Prozess kompilieren Sie auch B.cpp und A.cpp und versuchen, B.o und A.o zusammen mit main.o zu verknüpfen.

Die Verknüpfung B.o und A.o bewirkt, dass die Symbole display und square mehrfach definiert werden. display ist 3 mal definiert und square 2 mal definiert.

Sie kompilieren und erstellen main.cpp. Bauen Sie nicht A.cpp und B.cpp.

Zweite Weise ist das A.cpp und B.cpp-A.h und B.h und Funktionen inline machen. Sie werden also nur einmal kompiliert.

Dritte Weise, nicht enthalten B.cpp in main.cpp. Fügen Sie einfach die Funktionsdeklaration anstelle der Inklusion ein.

//main.cpp 

void square(int); 

int main() { 
    square(5); 
    return 0; 
} 

Im Allgemeinen werden Funktionsdeklarationen in Headerdateien abgelegt. Wenn dies in mehreren Fällen erforderlich ist, erstellen Sie eine Headerdatei.

+0

Danke für den Vorschlag, habe ich auf folgende Weise versucht, aber der Fehler besteht immer noch. 1. Reinigen Sie das Projekt. 2. Wählen Sie "Main.cpp" 3. Produkt -> Aktion ausführen -> Kompilieren "Main.cpp" 4. Wiederholen Sie Schritt 3 für "A.cpp" und "B.cpp" 5. Führen Sie das Projekt aus . 6. Bekam den gleichen Fehler. Ich habe auch versucht, nur "Main.cpp" zu kompilieren und dann ausführen, aber XCode baut das komplette Projekt.
Können Sie bitte ausführlich erklären, wie "Main.cpp" unabhängig kompiliert und erstellt wird. P.S. Ich benutze XCode 6.1.1 – Ahmad

+0

@Ahmad Sie bekommen immer noch nicht. Sie enthalten die gleiche Quelle in ** zwei verschiedenen Übersetzungseinheiten **. Der Code in 'A.cpp' wird als einzelne Übersetzungseinheit zu' Ao' kompiliert, dann wird der * gleiche Code * in 'main.cpp' eingeschlossen (was das ** echte ** Problem ist) . Die zweite Option in dieser Antwort ist ideal. TU das. – WhozCraig

+0

@WhozCraig Vielen Dank. Ich habe die zweite Option verwendet, die das Problem gelöst hat. – Ahmad

Verwandte Themen