2014-12-12 9 views
5

Sono nuovo di Xcode e quando costruire il seguente codice (un MWE), ottengo il seguente erroreSimboli Xcode C++ :: duplicati per l'Architettura x86_64

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

Ho tre file come segue;

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

Ho provato diversi metodi menzionato su stack overflow come il cambiamento "Build attivo Architettura Solo" su "Sì" ed alcuni altri, ma l'errore ancora persiste.

risposta

10

Il problema è che main.cpp ha incluso B.cpp e A.cpp. Nel processo di compilazione, compili anche B.cpp e A.cpp e prova a collegare B.o e A.o insieme a main.o.

Collegamento B.o e A.o causa la ripetizione dei simboli display e square. display è definito 3 volte e square definito 2 volte.

Basta compilare e creare main.cpp. Non costruire A.cpp e B.cpp.

Seconda modo è che rendono A.cpp e B.cpp-A.h e B.h e funzioni inline. Quindi, verranno compilati solo una volta.

Terzo modo, non includere B.cpp in main.cpp. Basta inserire la dichiarazione di funzione anziché l'inclusione.

//main.cpp 

void square(int); 

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

In genere, le dichiarazioni di funzione vengono inserite nei file di intestazione. Se è necessario in più casi, creare un file di intestazione.

+0

Grazie per il suggerimento, ho provato nel modo seguente ma l'errore persiste ancora. 1. Pulire il progetto. 2. Selezionare "Main.cpp" 3. Prodotto -> Esegui azione -> Compila "Main.cpp" 4. Ripetere il passaggio 3, per "A.cpp" e "B.cpp" 5. Eseguire il progetto . 6. Ha lo stesso errore. Ho anche provato a compilare solo "Main.cpp" e quindi eseguire ma XCode crea il progetto completo.
Potete per favore elaborare come compilare e compilare "Main.cpp" in modo indipendente. P.S. Sto usando XCode 6.1.1 – Ahmad

+0

@Ahmad non lo stai ancora ottenendo. Stai includendo la stessa fonte in ** due diverse unità di traduzione **. Il codice in 'A.cpp' è compilato come una singola unità di traduzione in' Ao', quindi lo * stesso codice * è '# include' -ed in' main.cpp' (che è il ** problema ** reale) . La seconda opzione in questa risposta è l'ideale. Fai quello. – WhozCraig

+0

@WhozCraig Grazie. Ho usato la seconda opzione, che ha risolto il problema. – Ahmad