1

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;
        }
};
4

4 に答える 4

6

それらはすべて同じパターンのリンカ エラーです。リンカー エラーは、独自のヘッダー ファイルで定義したクラスのすべてのプライベートな静的データ メンバーに関連しています。

すべての静的データ メンバーは、.cpp ファイルのどこかに定義が必要です。

エラー 38 エラー LNK2001: 未解決の外部シンボル "private: static double SingleDelay::dry" (?dry@SingleDelay@@0NA) Delays.obj testall

リンカーは、その変数に対して定義されたストレージがないことを示しています。この行は、正確に 1 つの .cpp ファイルのどこかに表示される必要があります。

double SingleDelay::dry = 0.0;
于 2009-03-01T09:15:47.167 に答える
2
  1. ライブラリを追加しておらず、使用するライブラリのパスをプロジェクト定義に追加していない可能性がありますか?
  2. C++ エラーはいつ見ても楽しいものです。か否か。いずれにせよ、静的変数をどこかで初期化しますか? これは、どこかの .cpp ファイルで行う必要があります。また、静的変数は注意して使用することを忘れないでください。これらは実際には変装したグローバル変数であり、マルチスレッドなどの将来の変更をより困難にする可能性があります。
于 2009-03-01T06:49:53.663 に答える
0

静的フィールドは非公開であるため、おそらくエラーは静的フィールドの可視性スコープに含まれます。クラス以外ではなく、クラス定義でプライベート静的フィールドを使用するコードを記述してみてください。このメソッドをクラス定義だけに記述します。

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

.cpp および .h ファイルを .vcproj ファイルに追加する必要があります。

于 2009-03-01T06:00:07.777 に答える