2012-02-14 32 views
53

Tôi đang viết mã C++ trên máy mac. Tại sao tôi gặp phải lỗi này khi biên dịch ?:lỗi liên kết biến tĩnh

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)

Không chắc chắn mã của tôi có sai hay tôi phải thêm cờ bổ sung vào Xcode. Cấu hình XCode hiện tại của tôi là cấu hình mặc định cho dự án 'thư viện tĩnh'.

Mã của tôi:

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

Tôi gọi 'phương pháp' từ mã thử nghiệm, theo cách này: Phương thức 'Đăng nhập :: ("asd"):'

cảm ơn sự giúp đỡ của bạn.

+4

Tôi không đồng ý rằng đây là một câu hỏi trùng lặp. Các câu hỏi khác tham chiếu là rất chung chung trong tự nhiên và sẽ không giúp tôi giải quyết vấn đề cụ thể mac của tôi. – Adam

Trả lời

65

Bạn phải xác định các số liệu thống kê trong tệp cpp.

Log.cpp

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

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

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

Bạn cũng nên loại bỏ using namespace std; từ tiêu đề. Nhận được thói quen trong khi bạn vẫn có thể. Điều này sẽ gây ô nhiễm không gian tên chung với std ở bất cứ nơi nào bạn bao gồm tiêu đề.

+0

Thay vào đó * khởi tạo * thay vì * xác định *, không (chỉ yêu cầu)? – Vyktor

+0

@Vyktor Tôi nghĩ cả hai đều được chấp nhận. –

+9

Có lẽ ngay cả một thuật ngữ tốt hơn sẽ là nó phân bổ không gian cho chuỗi. – btown

12

Bạn đã khai báo static string theString; nhưng chưa xác định.

Bao gồm

string Log::theString; 

để cpp tập tin của bạn

Các vấn đề liên quan