1

そこで、小さなプロジェクトとして、ストレス テストを書いていました。最初は、時間を節約するために、コードをヘッダー ファイルに挿入しました。少し整理することにし、すべてを .cpp ファイルに移動してからヘッダー ファイルを作成しましたが、VS2010 は修正できないように見える LNK2019 を提示してくれました。

FSTRESS.cpp (関連性が疑わしいため、コードは含めませんでした。必要かどうか尋ねてください) FSTRESS.cpp

FSTRESS.h FSTRESS.h

メイン.cpp メイン.cpp

エラー:

    error LNK2019: unresolved external symbol "public: static void __cdecl FSTRESS::Start(unsigned int,unsigned int,unsigned int)" (?Start@FSTRESS@@SAXIII@Z) referenced in function _main  C:\Programming\C++\FLOPS_Test\FSTRESS\FSTRESS\main.obj  FSTRESS_Mk.II

なぜこれが起こっているのかについてのアイデアはありますか? 私は少し C++ 初心者です。助けてくれてありがとう:)

4

3 に答える 3

2

あなたの.cppファイルは、 .hで宣言したものと同じクラスを定義していませんが、ヘッダーで宣言されたものと同じ名前の異なるクラスを作成しています。これを行う正しい方法は次のとおりです。

ヘッダー ファイル:

class Foo
{
  void Bar();
};

実装ファイル:

void Foo::Bar()
{
  // Do something
}

または、ヘッダーファイル自体で関数をインラインで宣言することもできます。

class Foo
{
  void Bar()
  {
    // Do something
  }
};

後者の場合、別の実装ファイルを作成する必要はありません。実際、これはまさにfstress.cppで行っていることですが、そのクラスを実際にどこにも定義せずにfstress.hで重複した宣言を提供します。

于 2012-07-12T21:30:47.990 に答える
1

したがって、実際にはx86FSTRESSクラスの 2 つの別個の定義があり、1 つはヘッダー ファイルにあり、もう 1 つは.cppファイルにあります。定義が同一であればそれを行うことができますが、そうではありません-.cppファイル内のものにはインラインコードがたくさんありますが、ヘッダーファイル内のものにはありません。(詳細については、「1 つの定義規則」を参照してください。)

あなたが実際にやりたいことはこれです。ヘッダー ファイルは問題ありません (または、少なくとも、目立った問題はありません)。この.cppファイルは、(1)#includeヘッダー ファイル、および (2) 次のようなメンバー関数の定義を提供する必要があります。

static void FSTRESS::Start(unsigned aMode, unsigned aTest, unsigned aThreads) {
  // code goes here
}

(ソース ファイルと対応するヘッダー ファイルがある場合、ソース ファイルは常に#includeヘッダー ファイルである必要があります。これにより、矛盾がある場合に、コンパイル時にきちんとキャッチされるようになります。すでに実行しているかどうかはわかりません。これは、スクリーン キャプチャではの上部FSTRESS.cppが見えないためです。コードをテキストとして投稿した方がよいかもしれません :-))

余談ですが、アンダースコアで始まる名前は使用しないでください。そのような名前のスペースの大部分は「予約済み」です。つまり、C++ 実装はそれらを内部で使用でき、使用がその使用と衝突すると悪いことが起こる可能性があります。それらすべてを避けるのが最善です。そうすれば、正確なルールが何であるかを覚えておく必要がなく、他の誰かがあなたのコードを読むこともありません。

于 2012-07-12T21:31:37.880 に答える
1

インライン コードを含むクラス宣言の内容をヘッダー ファイルから .cpp ファイルに貼り付けて、それが機能することを期待することはできません。の実装はFSTRESS::Start()、クラス宣言から分離すると、次のようになる必要があります。

void FSTRESS::Start(unsigned _aMode, unsigned _aTest, unsigned _aThreads)
{
    //...
}

また、#include "FSTRESS.h"FSTRESS.cpp ファイルで、誰もが使用するクラスの宣言が正確に行われるようにする必要があります (実装ビットを FSTRESS.cpp に含めます)。

于 2012-07-12T21:32:19.183 に答える