未定义的静态成员引用

时间:2012-02-02 10:12:58

标签: c++ undefined-reference cross-compiling

我正在使用交叉编译器。我的代码是:

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

我收到以下错误:

  

对WindowsTimer :: _ frequency'

的未定义引用

我也尝试将其更改为

LARGE_INTEGER _frequency.QuadPart = 0ull;

static LARGE_INTEGER _frequency.QuadPart = 0ull;

但我仍然遇到错误。

谁知道为什么?

5 个答案:

答案 0 :(得分:79)

您需要在.cpp文件中定义_frequency

LARGE_INTEGER WindowsTimer::_frequency;

答案 1 :(得分:26)

链接器不知道在哪里为_frequency分配数据,您必须手动告诉它。您可以通过简单地将此行LARGE_INTEGER WindowsTimer::_frequency = 0;添加到您的一个C ++源中来实现此目的。

更详细的解释here

答案 2 :(得分:18)

如果在类中声明了一个静态变量,那么你应该在cpp文件中定义它,就像这个

一样
LARGE_INTEGER WindowsTimer::_frequency = 0;

答案 3 :(得分:4)

使用C ++ 17,您可以声明变量inline,而无需再在cpp文件中定义它。

inline static LARGE_INTEGER _frequency;

答案 4 :(得分:0)

这是 this other question 的完整代码示例,它确实是此示例的副本。

#include <iostream>

#include <vector>
using namespace std;

class Car
{

public:
    static int b;                   // DECLARATION of a static member


    static char* x1(int x)
    {
        b = x;                      // The static member is used "not as a constant value"
                                    //  (it is said ODR used): definition required
        return (char*)"done";
    }

};

int Car::b;                         // DEFINITION of the static 

int main()
{
    char* ret = Car::x1(42);
    for (int x = 0; x < 4; x++)
    {
        cout << ret[x] << endl;
    }

    return 0;
}