2012-02-14 26 views
53

Mac'te C++ kodu yazıyorum. Benim kodu yanlış veya Xcode ek seçeneklerle eklemek zorunda emin değilimstatik değişken bağlantı hatası

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)

?: derlerken bu hatayı alıyorum neden. Geçerli XCode yapılandırmalarım, bir 'statik kitaplık' projesi için varsayılan olanlardır.

Kodum:

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

Ben Bir test kodundan 'method' (yöntem) 'i çağırmak, bu şekilde: ' Log :: method ("asd"): '

Yardımlarınız için teşekkürler.

+4

için

string Log::theString; 

ekleyin. Başvurulan diğer soru doğada çok genel ve benim mac özel sorunumu çözmek için bana yardımcı olmazdı. – Adam

cevap

65

Statleri cpp dosyasında tanımlamanız gerekir.

LOG.CPP

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

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

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

Ayrıca başlığından using namespace std; kaldırmalısınız. Hala yapabiliyorken alışkanlığa girin. Bu, üstbilgiyi eklediğiniz her yerde std ile global ad alanını kirletecektir.

+0

Bunun yerine * başlatır * yerine * * *, hayır (sadece sorar) tanımlanır? – Vyktor

+0

@Vyktor Bence kabul edilir. –

+9

Belki daha iyi bir terim bile, dizge için yer ayırmasıdır. – btown

12

static string theString; bildirdiniz, ancak tanımlamamışsınız.

Bu yinelenen bir soru olduğunu katılmıyorum senin cpp dosyası