2012-02-14 9 views
53

Sto scrivendo codice C++ su un mac. Perché ottengo questo errore durante la compilazione ?:errore di collegamento variabile statico

Undefined symbols for architecture i386: "Log::theString", referenced from: Log::method(std::string) in libTest.a(Log.o) ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

Non so se il mio codice è errato o devo aggiungere ulteriori flag a Xcode. Le mie attuali configurazioni XCode sono quelle predefinite per un progetto di 'biblioteca statica'.

Il mio codice:

Log.h ------------

#include <iostream> 
#include <string> 

using namespace std; 

class Log{ 
public: 
    static void method(string arg); 
private: 
    static string theString ; 
}; 

LOG.CPP ----

#include "Log.h" 
#include <ostream> 

void Log::method(string arg){ 
    theString = "hola"; 
    cout << theString << endl; 
} 

Sono chiamando il 'metodo' da un codice di prova, in questo modo: 'metodo Log :: ("asd"):'

grazie per il vostro aiuto.

+4

Non sono d'accordo che questa è una domanda duplicato. L'altra domanda a cui si fa riferimento è di natura molto generale e non mi avrebbe aiutato a risolvere il mio problema specifico per Mac. – Adam

risposta

65

È necessario definire la statica nel file cpp.

LOG.CPP

#include "Log.h" 
#include <ostream> 

string Log::theString; // <---- define static here 

void Log::method(string arg){ 
    theString = "hola"; 
    cout << theString << endl; 
} 

Si dovrebbe anche rimuovere using namespace std; dalla testata. Prendi l'abitudine mentre puoi ancora. Questo inquinerà lo spazio dei nomi globale con std ovunque tu includa l'intestazione.

+0

Invece * inizializza * invece di * definisce *, no (solo chiedendo)? – Vyktor

+0

@Vyktor Penso che entrambi siano accettati. –

+9

Forse anche un termine migliore sarebbe che alloca lo spazio per la stringa. – btown

12

Hai dichiarato static string theString;, ma non l'hai definito.

Includere

string Log::theString; 

al cpp file di