Undefinierter Verweis auf ein statisches Element

84

Ich benutze einen Cross-Compiler. Mein Code lautet:

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

Ich erhalte folgende Fehlermeldung:

undefinierter Verweis auf "WindowsTimer :: _ Frequenz"

Ich habe auch versucht, es zu ändern

LARGE_INTEGER _frequency.QuadPart = 0ull;

oder

static LARGE_INTEGER _frequency.QuadPart = 0ull;

aber ich bekomme immer noch Fehler.

weiß jemand warum?

Kakush
quelle
Wo (wenn überhaupt) haben Sie definiert WindowsTimer::_frequency ?
CB Bailey
@ CharlesBailey Es ist mein einziges Mitglied in der Klasse.
Kakush

Antworten:

103

Sie müssen _frequencyin der CPP-Datei definieren.

dh

LARGE_INTEGER WindowsTimer::_frequency;
Ed Heal
quelle
32

Linker weiß nicht, wo Daten zugeordnet werden sollen, _frequencyund Sie müssen dies manuell mitteilen. Sie können dies erreichen, indem Sie einfach diese Zeile hinzufügen: LARGE_INTEGER WindowsTimer::_frequency = 0;in eine Ihrer C ++ - Quellen.

Detailliertere Erklärung hier

Vyktor
quelle
26

Mit C ++ 17 können Sie Ihre Variable inline deklarieren , ohne sie mehr in einer CPP-Datei definieren zu müssen.

inline static LARGE_INTEGER _frequency;
Zhenxiao Hao
quelle
Dies gibt mir einen Fehlererror: 'foobar' declared as an 'inline' field
Pedro Henrique
3
NVM, ich habe gerade mein GCC über den MinGW-Manager von 6.3 auf 8.2 aktualisiert und es funktioniert einwandfrei.
Pedro Henrique
23

Wenn in der Klasse eine statische Variable deklariert ist, sollten Sie sie in der cpp-Datei wie folgt definieren

LARGE_INTEGER WindowsTimer::_frequency = 0;
Raghuram
quelle