2012-02-14 11 views
53

Piszę kod C++ na komputerze Mac. Dlaczego otrzymuję ten błąd podczas kompilacji ?:Błąd łącza statycznego

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)

nie wiem, czy mój kod jest nieprawidłowy lub muszę dodać dodatkowe flagi do Xcode. Moje bieżące konfiguracje XCode są domyślnymi dla projektu "biblioteki statycznej".

Mój kod:

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

jestem wywołanie "metody" z kodu testowego, w ten sposób: 'Log :: method ("asd"):'

dzięki za pomoc.

+4

cpp nie zgadzam się, że jest to duplikat pytanie. Inne pytanie, o którym mowa, ma charakter bardzo ogólny i nie pomogłoby mi rozwiązać mojego konkretnego problemu z Mac. – Adam

Odpowiedz

65

Musisz zdefiniować statykę w pliku cpp.

Log.cpp

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

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

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

Należy również usunąć using namespace std; z nagłówka. Nabierz nawyku, póki jeszcze możesz. Spowoduje to zanieczyszczenie globalnej przestrzeni nazw za pomocą std, niezależnie od tego, gdzie znajduje się nagłówek.

+0

Raczej * inicjuje * zamiast * definiuje *, nie (po prostu pyta)? – Vyktor

+0

@Vyktor Myślę, że obie są akceptowane. –

+9

Być może lepszym terminem jest to, że alokuje spację dla ciągu znaków. – btown

12

Użytkownik zadeklarował static string theString;, ale go nie zdefiniował.

Dołącz

string Log::theString; 

do pliku

Powiązane problemy