211

Visual Studio でのコーディング中に、未解決の外部シンボル エラーが発生しました。どうすればよいかわかりません。何が悪いのかわからない。私を解読していただけますか?どのような種類のエラーをどこで探す必要がありますか?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals
4

29 に答える 29

328

このエラーは、多くの場合、一部の関数には宣言があり、定義がないことを意味します。

例:

// A.hpp
class A
{
public:
  void myFunc(); // Function declaration
};

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}

あなたの場合、定義が見つかりません。問題は、いくつかの関数宣言をもたらすヘッダーファイルをインクルードしている可能性がありますが、次のいずれかです。

  1. cppファイルで関数を定義しないでください(このコードを自分で作成した場合)
  2. 定義を含むlib/dllファイルを含めないでください

よくある間違いは、関数をスタンドアロンとして定義し、クラスセレクターを忘れてしまうことです。たとえばA::.cppファイルでは次のようになります。

間違った: void myFunc() { /* do stuff */ }
正しい: void A::myFunc() { /* do stuff */ }

于 2012-03-29T15:29:14.200 に答える
29

参照しているソリューション内にすべてのソースファイルが含まれていることを確認してください。

クラスのソースファイル(したがって実装)をFieldプロジェクトに含めないと、クラスはビルドされず、コンパイル中にリンクできなくなります。

あるいは、静的または動的ライブラリを使用していて、リンカーに.libsについて伝えるのを忘れている可能性がありますか?

于 2012-03-29T15:15:17.577 に答える
13

ライブラリまたはインクルードが欠落しているようです。ライブラリのどのクラスが getName、getType などを持っているかを調べて、それをヘッダー ファイルに入れるか、#include.

また、これらが外部ライブラリからのものである場合は、プロジェクト ファイルでそれらを参照していることを確認してください。たとえば、このクラスが abc.lib に属している場合、Visual Studio で

  1. プロジェクトのプロパティをクリックします。
  2. [構成プロパティ]、[C/C++]、[生成] に移動し、[追加のインクルード ディレクトリ] の下にある abc.lib の場所を指していることを確認します。Linker、Input の下で、Additional Dependencies の下に abc.lib があることを確認します。
于 2012-03-29T15:20:22.327 に答える
10

.h ファイルで正しく宣言され、.c ファイルで定義された、.cpp ファイルのメインから関数を呼び出すことができないという問題を見てきました。リンカー エラーが発生しました。その間、通常の .c ファイルから関数を呼び出すことができます。おそらくそれは呼び出し規約に依存します。解決策は、すべての .h ファイルに次の preproc 行を追加することでした:

#ifdef __cplusplus
extern "C"
{
#endif

そしてこれらは最後に

#ifdef __cplusplus
}
#endif
于 2015-09-14T13:40:28.473 に答える
6

新しいヘッダー ファイルが追加され、それが原因でこのエラーが発生し始めた場合は、ライブラリを追加してunresolved external symbol.

例えば:

#include WtsApi32.h

必要があります:

#pragma comment(lib, "Wtsapi32.lib") 
于 2016-06-21T13:05:50.827 に答える
3

上記の Chris Morris による優れた回答に加えて、pure に設定されていないが独自の実装を持たない仮想メソッドを呼び出している場合に、この同じ障害を受け取る非常に興味深い方法を見つけました。これはまったく同じ理由です (コンパイラはメソッドの実装を見つけることができないため、詐欺師です) が、私の IDE はこの障害をまったく検出しませんでした。

たとえば、次のコードでは、同じエラー メッセージでコンパイル エラーが発生します。

//code testing an interface
class test
{
   void myFunc(); 
}

//define an interface
class IamInterface
{
    virtual void myFunc();
}

//implementation of the interface
class IamConcreteImpl
{
    void myFunc()
    {
       1+1=2;
    }
}

ただし、 IamInterface myFunc() を純粋な仮想メソッド (実装が「必須」であり、メソッドである仮想メソッドよりも「オーバーライドできる」メソッド) に変更すると、コンパイル エラーが解消されます。

//define an interface
class IamInterface
{
    virtual void myFunc() = 0;
}

これが、次の StackOverFlow 担当者がコードをステップ実行するのに役立つことを願っています!

于 2015-05-11T13:26:04.397 に答える
2

ヘッダーファイルを必ず装飾してください

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

そうしないと、これを含む悪いことが起こる可能性があります

于 2015-06-24T23:00:45.937 に答える
2

MSDN のリンカ ツール エラー LNK2019を参照してください。LNK2019の原因となる一般的な問題の詳細なリストがあります。

于 2015-06-12T12:46:42.230 に答える
2

私はこれに苦労しました。すべてが論理的に設定されました。コンストラクターを宣言しましたが、定義しませんでした

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}

とても初歩的なことを忘れたとき、キーボードに頭をぶつけそうになりました。

于 2015-01-18T06:25:59.647 に答える
2

このエラーは、テンプレート クラスの関数定義を別の .cpp ファイルに入れることによって発生する可能性があります。テンプレート クラスの場合、メンバー関数はヘッダー ファイルで宣言する必要があります。この問題は、メンバー関数をインラインで定義するか、.h ファイルのクラス定義の直後に定義することで解決できます。

たとえば、関数定義を他のクラスのように .cpp ファイルに入れる代わりに、次のようにインラインで定義できます。

template<typename T>
MyClassName {
  void someFunction() {
    // Do something
    ...
  }
  void anotherFunction() {
    // Do something else
    ...
  }
}

または、次のように、クラス定義の後に同じファイルで定義することもできます。

template<typename T>
MyClassName {
  void someFunction();
  void anotherFunction();
}

void MyClassName::someFunction() {
  // Do something
  ...
}
void MyClassName::anotherFunction() {
  // Do something else
  ...
}

他の誰もテンプレートクラスについて言及していないようなので、それを共有したいと思いました。これが私の場合のエラーの原因でした。

于 2020-08-03T20:25:13.490 に答える
1

ポインタ

この問題があり、ポインターを使用して解決しました。これはあなたの問題ではないようですが、1 時間前にこれを見たときにここにあればよかったと思うので、言及したいと思いました。私の問題は、静的メンバー変数を定義せずに宣言することでした (定義は他のセットアップの後に来る必要がありました)。もちろん、ポインターには定義は必要ありません。同様に初歩的な間違い :P

于 2015-05-07T09:09:48.707 に答える
1

久しぶりに C++ を実行していますが、関数定義に ClassName:: プレフィックスを追加するのを忘れると、このエラーが発生します。これは、C++ に少し固有のものであるためです。ということで、こちらも忘れずにチェック!

于 2015-02-23T21:13:54.347 に答える
0

私の問題は、sconscript にcppファイルが定義されていないことでした。cppVisual Studioにはプロジェクト内のファイルがありますが、他の何かが完全に構築されているため、これは非常に混乱する可能性があります。

于 2016-01-21T00:03:33.303 に答える
0

数時間かけて、メインファイルの拡張子.c.cpp

:/

于 2016-07-15T23:49:13.670 に答える
0

私の問題は、ctorが「未解決の外部」であるクラスの前方宣言を行う必要があったことです。

エラーが発生したファイルには、次のようなものを配置する必要がありました。

#include "ClassB" 

class ClassB; // this solved the problem

class ClassA{
    void foo(){
        ClassB* tmp = new ClassB();
        // ...
    }
};

もちろん、私のプロジェクトはもっと複雑で、これはほんの一部の例です。また、名前空間を使用する場合は、それらも宣言します

于 2016-05-27T16:24:12.543 に答える
0

挿入または抽出演算子をインライン関数としてオーバーロードしようとしていないことを確認してください。私はこの問題を抱えていましたが、そのキーワードを削除したときにのみ消えました。

于 2017-11-17T04:00:37.287 に答える