2012-02-14 16 views
53

मै मैक पर सी ++ कोड लिख रहा हूं। संकलन करते समय मुझे यह त्रुटि क्यों मिलती है ?:स्थिर चर लिंक त्रुटि

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)

सुनिश्चित नहीं है कि मेरा कोड गलत है या मुझे एक्सकोड में अतिरिक्त झंडे जोड़ना है। मेरी वर्तमान एक्सकोड कॉन्फ़िगरेशन 'स्थिर लाइब्रेरी' प्रोजेक्ट के लिए डिफ़ॉल्ट हैं।

मेरे कोड:

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

मैं एक विधि कोड से 'विधि' को कॉल करना, इस प्रकार: 'लॉग :: विधि ("asd"):'

आपकी सहायता के लिए धन्यवाद।

+4

को

string Log::theString; 

शामिल करें मैं सहमत नहीं है कि यह एक डुप्लिकेट सवाल है। संदर्भित अन्य प्रश्न प्रकृति में बहुत सामान्य है और मेरे मैक विशिष्ट मुद्दे को हल करने में मेरी मदद नहीं की होगी। – Adam

उत्तर

65

आपको cpp फ़ाइल में statics को परिभाषित करना होगा।

Log.cpp

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

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

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

तुम भी using namespace std; हैडर से निकाल देना चाहिए। आदत में जाओ, जबकि आप अभी भी कर सकते हैं। यह जहां भी आप हेडर शामिल करते हैं, std के साथ वैश्विक नामस्थान को प्रदूषित करेगा।

+0

बल्कि * * * के बजाय * शुरू होता है *, नहीं (बस पूछ रहा है)? – Vyktor

+0

@ विक्टर मुझे लगता है कि दोनों स्वीकार किए जाते हैं। –

+9

शायद एक बेहतर शब्द भी होगा कि यह स्ट्रिंग के लिए स्थान आवंटित करता है। – btown

12

आपने static string theString; घोषित किया है, लेकिन इसे परिभाषित नहीं किया है।

अपने cpp फ़ाइल

संबंधित मुद्दे