1

私はC++とVSの経験が浅く、何が間違っているのか、さらに重要なのはそれを修正する方法を理解できません。

私は複数のプロジェクトでソリューションに取り組んでおり、現在、あるプロジェクトのクラスを別のプロジェクトで使用し始めています。ただし、次のエラーが発生します。

tlibdecoder.lib(TDecCu.obj):エラーLNK2001:未解決の外部シンボル "public:void __thiscall CURegister :: registerCU(int、int、int)"(?registerCU @ CURegister @@ QAEXHHH @ Z)

問題は、CURegister.hファイルとCURegister.cppファイルに由来するTDecCu.cppで使用している関数にあるようです。

CURegister.cppの上にCURegister.hを含めたので、関数が定義されています(CURegister.hをインポートするjsutによって同じプロジェクト内で通常使用できます)が、ヘッダーをTDecCu.cppに含めると(#include "を追加することにより)上部のCURegister.h")問題があるようです。

誰かがこれを修正する方法を教えてもらえますか?私は経験が浅いので、本当に簡単に説明してもかまいません;)

前もって感謝します。B

4

2 に答える 2

3

「未解決のシンボルエラー」は、コンパイラエラーではなく、リンカエラーです。リンクは、VisualStudioなどのIDEで単一の「ビルド」イベントのように見えるものの第2段階です。

ここでの中心的な問題は、C++での宣言定義の違いに関するものです。要するに、宣言は(関数のような)シンボルをコンパイラーに導入し、定義はリンカーにそのシンボルの実際のインスタンス化/実装を提供します。関数を考えるとき、定義はおそらくあなたが聞いたことがあるものであり、プロトタイプと呼ばれます。このようなもの:

void registerCu(int x, int y, int depth);

関数の実装を提供していないため、単なる定義であることに注意してください。これは、完全な実装を提供する宣言とは異なります。

void registerCu(int x, int y, int depth)
{
    // do magic stuff here  
}

これが単一の自己完結型プロジェクトである場合、リンカーエラーが、関数の定義を提供できなかったことを警告していると見なすことができます。これはおそらく、どこかのヘッダーにプロトタイプを書き込んだのに、対応する.cppファイルに関数の内容を実際に書き込んでいないことを意味します。

しかし、実際の回答に対するコメントは、実際に.cppファイルで実装を提供したことを示しており、質問には複数のプロジェクトで作業していることが示されているため、2番目のプロジェクトが関数定義を見つけられない可能性が高くなります。2番目のプロジェクトに宣言を提供する最初のプロジェクトのヘッダーを含めたので、コンパイラーは満足しています。しかし、リンカがその関数呼び出しのオブジェクトコードに実際にリンクしようとすると、定義が見つからないためにがっかりします。

これを修正するには、2番目のプロジェクトのリンカーに、最初のプロジェクトのオブジェクトコードで、見つからない定義がないかどうかを確認するように指示します。これを行うには、通常、最初のプロジェクトのビルド出力を含むフォルダーへのパスを2番目のプロジェクトのリンカー設定に追加します。

于 2012-07-26T09:44:41.700 に答える
0

TDecCu.cppが存在するプロジェクトにCURegister.hとCURegister.cppの両方を追加する必要があります。

.hには宣言のみが含まれ、.cppには実装が含まれます。プロジェクトがコンパイルされると、コンパイラはプロジェクトファイルまたはプロジェクトによって参照されるいくつかのlibファイルから必要なすべての実装を見つけようとします。

ファイルに.hを含めるだけの場合、コンパイラがその実装を見つける方法はありません。

于 2012-07-26T09:39:52.977 に答える