1

我正在尝试在 Visual Studio 2008 中构建一个项目。我遇到了一堆真正困扰我的链接器错误。我的应用程序是仅使用本机 ANSI C++ 的 Win32 控制台应用程序。

它们都是相同模式的链接器错误。链接器错误与我在自己的头文件中定义的类的每个私有静态数据成员有关。

我猜这可能是我还不知道的 c++ 的一个简单事实?

示例:我在文件Delays.cpp 中的SingleDelay 成员类的函数定义中引用SingleDelay 的成员。IE:

SingleDelay::tick(void *output, void *input, int nbufferFrames)<br>{
   //.. code here<br>
   x = dry * castInput + wet * castInput;<br>
}

错误 38 错误 LNK2001:无法解析的外部符号“私有:静态双 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;
        }
};
4

4 回答 4

6

它们都是相同模式的链接器错误。链接器错误与我在自己的头文件中定义的类的每个私有静态数据成员有关。

所有静态数据成员都必须在 .cpp 文件中的某处有定义。

错误 38 错误 LNK2001:无法解析的外部符号“私有:静态双 SingleDelay::dry”(?dry@SingleDelay@@0NA)Delays.obj testall

链接器告诉您该变量没有定义的存储。此行必须恰好出现在一个 .cpp 文件中的某处:

double SingleDelay::dry = 0.0;
于 2009-03-01T09:15:47.167 回答
2
  1. 也许您还没有添加库并将您使用的库的路径包含到项目定义中?
  2. C++ 错误总是很有趣。或不。无论如何,您是否在任何地方初始化静态变量?您需要在某处的 .cpp 文件中执行此操作。记住要小心使用静态变量。它们实际上是变相的全局变量,并且可以使将来的更改(例如多线程)更加困难。
于 2009-03-01T06:49:53.663 回答
0

您需要将 .cpp 和 .h 文件添加到 .vcproj 文件中。

于 2009-03-01T06:00:07.777 回答
0

也许错误存在于您的静态字段可见范围内,因为它们是私有的。尝试编写在类定义中使用您的私有静态字段的代码,而不是超出您的类。仅在您的类定义中编写此方法:

class SingleDelay{
 ...
int tick(void *output, void *input, int nbufferFrames)
{ //.. code here
x = dry * castInput + wet * castInput;
}
 ...
}
于 2010-10-30T07:34:27.423 回答