我正在尝试在Visual Studio 2008中构建一个项目。我收到了一堆真正困扰我的链接器错误。我的应用程序是仅使用本机ANSI C ++的Win32控制台应用程序。
它们都是相同模式的链接器错误。 链接器错误与我在自己的头文件中定义的类的每个私有静态数据成员相关。
我猜这可能是c ++的一个简单事实我还没有意识到?
实施例: 我在文件Delays.cpp中引用SingleDelay的成员在SingleDelay的成员类的函数定义中。 即:
SingleDelay::tick(void *output, void *input, int nbufferFrames)<br>{
//.. code here<br>
x = dry * castInput + wet * castInput;<br>
}
错误38错误LNK2001:未解析的外部符号“private:static double SingleDelay :: dry”(?dry @ SingleDelay @@ 0NA)Delays.obj testall
Delays.h中SingleDelay的定义:
class SingleDelay{
private:
static double dry; //% of dry signal<br>
static double wet; //% of wet signal<br>
static unsigned int delay; //Delay in milliseconds<br>
static int delayCell; //Index in the delayBuffer of the delay to add<br>
static double *delayBuffer; //Delay buffer is 1 second long at sample rate SAMPLE_RATE<br>
static unsigned int bufferCell; //Pointer to the current delay buffer cell<br>
public:
//Tick function
static void tick(void *output, void *input,int nBufferFrames);
//Set and Get functions
static void setSingleDelay(double tDry, double tWet, unsigned int tDelay);
static void setSingleDelay(void);
static void setDry(double tDry);
static void setWet(double tWet);
static void setDelay(unsigned int tDelay);
static double getDry(){ return dry;}
static double getWet(){ return wet;}
static unsigned int getDelay(){ return delay;}
static void initializeDelayBuffer(){
destroyDelayBuffer();
delayBuffer = new double[bufferLength];
}
static void destroyDelayBuffer(){
delete[ ] delayBuffer;
}
};
答案 0 :(得分:6)
它们都是相同模式的链接器错误。链接器错误与我在自己的头文件中定义的类的每个私有静态数据成员相关。
所有静态数据成员必须在.cpp文件某处中有定义。
错误38错误LNK2001:未解析的外部符号“private:static double SingleDelay :: dry”(?dry @ SingleDelay @@ 0NA)Delays.obj testall
链接器告诉您该变量没有已定义的存储空间。此行必须出现在一个.cpp文件中的某个位置:
double SingleDelay::dry = 0.0;
答案 1 :(得分:2)
答案 2 :(得分:0)
您需要将.cpp和.h文件添加到.vcproj文件中。
答案 3 :(得分:0)
可能错误在于您的静态字段可见范围,因为它们是私有的。 尝试编写在类定义中使用privete静态字段的代码,而不是在类之外。 在您的类定义中写下此方法:
class SingleDelay{
...
int tick(void *output, void *input, int nbufferFrames)
{ //.. code here
x = dry * castInput + wet * castInput;
}
...
}