web-dev-qa-db-ja.com

オブジェクトファイル内の未解決の外部シンボル

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
163
Novellizator

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

例:

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

// A.cpp

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

あなたの場合は、定義が見つかりません。 問題は、あなたがヘッダファイルをインクルードしていることであるかもしれません、それはいくつかの関数宣言を持ち込みます、しかし、あなたはどちらか:

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

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

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

279
Chris Morris

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

あなたのプロジェクトにクラスFieldのソースファイル(そしてその実装)を含めていない場合、それはビルドされず、コンパイル中にリンクすることはできません。

あるいは、おそらくスタティックまたはダイナミックライブラリを使用していて、リンカに.libsについて伝えるのを忘れていませんか。

23
Konrad

ライブラリが見つからないか、インクルードされているように見えます。getName、getTypeなどを持っているライブラリのクラスを見つけて、それをヘッダファイルに含めるか、#includeを使用してください。

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

  1. プロジェクトのプロパティをクリックします。
  2. [構成プロパティ]、[C/C++]、[生成]の順に選択し、[追加のインクルードディレクトリ]の下のabc.libの場所を指定していることを確認します。 [リンカー]、[入力]の下で、[追加の依存関係]の下にabc.libがあることを確認します。
11
Fylix

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

#ifdef __cplusplus
extern "C"
{
#endif

そしてこれらは最後に

#ifdef __cplusplus
}
#endif
6
Alexey257

私のプロジェクトが x64 projectとしてコンパイルされているというエラーがありました。そして私は Library を使って x86 としてコンパイルしました。

私はx64としてライブラリを再コンパイルしました、そしてそれはそれを解決しました。

4
Gal Bracha

私は同じリンクエラーがありましたが、別のDLLを参照していたテストプロジェクトからのものです。エラーメッセージで指定された各関数の前に_declspec(dllexport)を追加した後、リンクがうまくいっていたことを発見しました。

4
meJustAndrew

原因と対策に関する点の大部分は、このスレッドのすべての貢献者によってカバーされていると思います。 「未解決の外部」問題を指摘したいのですが、それはマクロとして定義されたデータ型が予想とは異なる方法で代入され、その結果、問題の関数に誤った型が渡されたためです。定義されていない、それは解決されていない可能性があります。特に、C/C++ - > Languageの下には、 'WChar_tを組み込み型として扱う'という属性があり、これは 'No(/ Zc:wchar_t-)'として定義されているはずですが、私の場合ではありません。

3
Patrick Nguyen

新しいヘッダファイルが追加され、それが原因でこのエラーが発生する場合があるので、unresolved external symbolを取り除くためにライブラリも追加する必要があります。

例えば:

#include WtsApi32.h

必要があります:

#pragma comment(lib, "Wtsapi32.lib") 
3
Shashank

上記のChris Morrisによる優れた回答に加えて、純粋に設定されていないが独自の実装ではない仮想メソッドを呼び出す場合にも、同じ問題が発生する可能性があるという非常に興味深い方法が見つかりました。これはまったく同じ理由です(コンパイラがメソッドの実装を見つけることができず、したがって詐欺師になります)が、私の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の人がコードをステップ実行するのに役立つことを願っています!

2
GMLewisII

あなたがあなたのヘッダファイルを飾ることを確認してください

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

そうでなければ悪いこと - これを含む - が起こる可能性があります

2
Panouden

このリンカエラーの考えられる原因の1つは、宣言されているがヘッダーファイルで定義されていないinline関数で、後で他の場所にインクルードされていることです。インライン関数は、それらが使用されているすべての変換単位で定義する必要があります。

1
bweber

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

1

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

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

私が何か基本的なことを忘れたとき、私はキーボードに頭をぶつけた。

1
Joe Plante

私は久しぶりにC++をやっています、そしてこれがC++にちょっとユニークなので、関数定義のためにClassName ::接頭辞を追加するのを忘れたとき、私はこのエラーを得ます。だから、それもチェックすることを忘れないでください!

1
Matthew Hayes

私の場合は何が原因でした。

Foo.hのない巨大なファイルFoo.cppがありました。 Foo.cppはこのように始まっています:

// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;

"static"キーワードを削除し、これと共にFoo.hを追加しました。

extern int var;

あなたは間違いを見ますか?

名前空間の宣言が他のコードに埋め込まれていたため、varがもともと名前空間で定義されていたことを完全に見逃しました。解決策は、このようにexternを変更することです。

namespace NS {
     extern int var;
}
0
Stefan Monov

私の問題はcppファイルが定義されていないsccriptであった。 Visual Studioのプロジェクトにはcppファイルがありますが、他には完全に構築されているため、これは非常に混乱を招く可能性があります。

0
ubershmekel

確認するためのもう一つの可能​​性、それは今回私の問題でした。

ライブラリに機能を追加し、検索パスにライブラリの出力フォルダを含めました。

しかし、私は以前にリストされたライブラリの古いバージョンのフォルダも持っていたので、VSは古いライブラリを使っていて、そしてもちろん新しい機能を見つけることができませんでした。

0
Francesco Dondi

まだ別の可能性のある問題(私はしばらくの間私の頭を擦ったばかりです):

あなたの関数をinlineとして定義するなら、それらは - もちろん - ! header (または inline ファイル)で定義されるべきで、 cpp ではありません。
私の場合、それらはインラインファイルの中にありましたが、それはプラットフォーム固有の実装であり、 cpp にはヘッダーの代わりにこの対応する inl file…が含まれていたからです。ええ、それは起こりません。

私もこれをここに残すと思いました、たぶん他の誰かが同じ問題に遭遇してここでそれを見つけます。

0

私の問題は次のとおりです。ctorが「未解決の外部」であるクラスの 前方宣言 を実行する必要がありました。

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

#include "ClassB" 

class ClassB; // this solved the problem

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

もちろん、私のプロジェクトははるかに複雑で、これはほんの一部の例です。また、名前空間を使うときは、 と宣言してください

0
vicrucann

ポインター

私はこの問題を抱えていて、ポインタを使ってそれを解決しました。これはあなたの問題ではないと思いますが、私が1時間前にこれを見たときにそれがここにあったことを願っているので私はそれを言及すると思いました。私の問題は、静的メンバー変数を定義せずに宣言すること(他の設定の後に定義を定義する必要があること)と、もちろんポインターに定義を必要としないことでした。同じく初歩的な間違い:P

0
Rabel

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

0
Beck

問題が私のメインファイルの拡張子.cではなく.cppであることを見つけるために数時間を費やしたところ

:/

0
Madhur