2012-02-02 42 views
32

Tôi đang sử dụng trình biên dịch chéo. Mã của tôi là:Tham chiếu không xác định cho thành viên tĩnh

class WindowsTimer{ 
public: 
    WindowsTimer(){ 
    _frequency.QuadPart = 0ull; 
    } 
private: 
    static LARGE_INTEGER _frequency; 
}; 

tôi nhận được lỗi sau:

undefined reference to `WindowsTimer::_frequency'

Tôi cũng đã cố gắng để thay đổi nó để

LARGE_INTEGER _frequency.QuadPart = 0ull; 

hoặc

static LARGE_INTEGER _frequency.QuadPart = 0ull; 

nhưng tôi vẫn gặp lỗi.

có ai biết tại sao không?

+0

bản sao có thể có của [tham chiếu không xác định đối với thành viên tĩnh, lỗi liên kết] (http://stackoverflow.com/questions/9074073/undefined-reference-to-baseobject-linker-error-cw-freeglut) – iammilind

+0

Ở đâu (nếu ở bất kỳ đâu) có bạn _defined_ 'WindowsTimer :: _ frequency'? –

+0

@CharlesBailey Đây là thành viên duy nhất của tôi trong lớp. – kakush

Trả lời

54

Bạn cần xác định _frequency trong tệp .cpp.

ví dụ:

LARGE_INTEGER WindowsTimer::_frequency; 
15

Linker không biết nơi nào để phân bổ dữ liệu cho _frequency và bạn phải nói với nó bằng tay. Bạn có thể đạt được điều này bằng cách đơn giản thêm dòng này: LARGE_INTEGER WindowsTimer::_frequency = 0; vào một trong các nguồn C++ của bạn.

chi tiết hơn giải thích here

13

Nếu có một biến tĩnh khai báo bên trong lớp thì bạn nên xác định nó trong file cpp như thế này

LARGE_INTEGER WindowsTimer::_frequency = 0; 
-1

Thêm này extern LARGE_INTEGER WindowsTimer::_frequency trong file cpp .

+1

Điều này sẽ không hoạt động vì 'extern'. Trình biên dịch của tôi nói * 'error: không thể khai báo thành viên 'LARGE_INTEGER WindowsTimer :: _ frequency' để có liên kết extern *. Và cùng một giải pháp mà không có 'extern' đã được đề cập trong ba câu trả lời khác. – HolyBlackCat

+0

Nó làm việc cho tôi. –

+0

LARGE_INTEGER là gì ?? –

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