2009-03-01 5 views
1

Visual Studio 2008でプロジェクトを構築しようとしています。本当に気になるリンカーエラーが発生しています。私のアプリケーションは、ネイティブのANSI C++のみを使用するWin32コンソールアプリケーションです。ヘッダーファイルのクラスのプライベートメンバーとのリンカーエラー

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

私はこれがおそらくC++の単純な事実であると推測しています。私はすでに認識していませんか?

例: SingleDelayのメンバクラスの関数定義内のSingleDelayのメンバは、ファイルDelays.cppにあります。 すなわち:

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

エラー38エラーLNK2001:未解決の外部シンボル "プライベート:静的ダブルSingleDelay ::ドライ"(ドライ@ SingleDelay @@ 0NA?)Delays.obj遅延のSingleDelayのtestall

定義に.h:

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

リンクエラーは表示されますか? –

+0

Yehha、あなたは正確なリンカーエラーを投稿したいかもしれないので、理由が何であるかを提案することができます。 –

+0

さて、私はそれに気付きました.2つのエラー例と関連するコードをいくつか追加しました。 – Rich

答えて

2
  1. あなたはライブラリを追加しておらず、プロジェクト定義に使用するライブラリのパスを含んでいますか?
  2. C++のエラーは、常に見て楽しいです。か否か。いずれの場合でも、静的変数をどこにでも初期化しますか?これは.cppファイルのどこかで行う必要があります。静的変数は注意して使用してください。それらは実際には変装のグローバル変数であり、マルチスレッドなどの将来の変更をより困難にする可能性があります。
+0

2.そうだね、問題の原因となった静的変数の初期化だと思いました。それは.cppで行う必要がありますか、.hファイルのクラス定義の後に行うことはできますか?初期化された値は実際にクラスを使用するときに上書きされるため、私にとってはそれほど重要ではありません。 – Rich

+0

静的な使用に関しては、私の目的のために、ユーザーがそれぞれの唯一のものを一度に1つしか使用していないため、すべての遅延クラスを静的にしていたので、クラスをインスタンス化するのは不必要で、静かに行くことで私は避けた自分。 – Rich

+0

さて、変数をもう一度初期化しようとしましたが、今度はこの変数が働きました。最初の小さな間違いをしていたようだ。誰も助けてくれてありがとう、時には同じことを2回試してみるように他の人に促すこともあります。 – Rich

0

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

+0

私はその意味がわかりません。 .vcprojファイルをテキストエディタなどで手動で編集することはありません。ドラッグ&ドロップして、必要なインクルードファイルをプロジェクトのソリューションエクスプローラのヘッダファイルドロップダウンメニューにドロップしました。ソースファイルメニューにある* .cppファイルも置いています。 – Rich

+0

私は実際に#2のリンカエラーの大半を解決するように見えるいくつかの.cppファイルが見つかりませんでした。私はまだ#1型のリンカーエラーが何であるかについてはまだ分かりません。 – Rich

+0

[プロジェクト] - > [ファイルの追加]に移動し、ドラッグアンドドロップの代わりに.cppと.hを選択します。 – Vinay

6

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

すべて静的データメンバ .cppファイルのどこかでの定義を持っている必要があります。

エラー38エラーLNK2001:未解決の外部シンボル "プライベート:静的ダブルSingleDelay ::ドライ"(?ドライ@ SingleDelay @@ 0NA)Delays.obj testall

リンカはことを言っているがその変数のための定義されたストレージはありません。このライン必見は、1つの.cppファイルのどこかに表示されます。彼らはプライベートであるため、

double SingleDelay::dry = 0.0; 
0

たぶんエラーは、静的フィールドの可視性スコープで構成されています。 あなたのクラスを超えてではなく、クラス定義であなたのprivete静的フィールドを使用するコードを書きます。 このメソッドをクラス定義に書き込んでください:

class SingleDelay{ 
... 
int tick(void *output, void *input, int nbufferFrames) 
{ //.. code here 
x = dry * castInput + wet * castInput; 
} 
... 
} 
関連する問題