知識は単独のものではなく、体系化されたものでなければなりません。私の個人的な概要と関連する経験の詳細については、このコラム「 Visual Studio」を参照してください。
質問
他の人が検索時に私の記事を取得できるように、エラー メッセージをコピーします。エラーメッセージは次のとおりです。
重大度 コード 説明 プロジェクト ファイル行の抑制 ステータス
エラー LNK2005 「class NatNetClient * g_pClient」 (?g_pClient@@3PEAVNatNetClient@@EA) は SampleClient.obj にすでに定義されています GUISample C:\Users\jicha\source\repos\GUISample\GUISample.obj 1
エラーのスクリーンショットは次のとおりです。
解決
これは、次のようなさまざまな理由で発生する可能性があります。
- 現在のソリューションまたはプロジェクト ファイルに複数の main() 関数、つまり 2 つのプログラム エントリが表示されます。
- グローバル変数の重複定義
- サードパーティライブラリの使用によって発生するライブラリ間の競合
- ヘッダーファイルの重複インクルード
ここで遭遇したのは 4 番目のケースなので、主に 4 番目の論理構造を示します。
Base.h
とBase.cpp
という3 つのソース ファイルがあるとしますmain.cpp
。
で基本クラスを定義しますBase.h
。基本クラスにはコンストラクターとデストラクターの宣言のみが含まれており、関数はBase.cpp
で実装されることに注意してください。
さらに、Base.h
に関数定義があります (関数の宣言と定義はBase.h
ファイル内にあります)
// Base.h
#include<iostream>
#include<string>
using namespace std;
class Base{
public:
Base();
~Base();
private:
char *p;
};
void platform(Base *pBase){
cout << "this is just a function..." << endl;
}
// Base.cpp
#include "Base.h"
Base::Base(){
cout << "construction function..." << endl;
}
Base::~Base(){
cout << "destructor function..." << endl;
delete p;
}
//main.cpp
#include"Base.h"
#include<iostream>
using namespace std;
int main(){
cout << "main..." << endl;
Base * pBase = new Base;
delete pBase;
system("pause");
return 0;
}
このままコンパイルするとLNK2005のエラーが表示されます。
Base.cpp
これは、2 つの実装ファイルのmain.cpp
両方にBase.h
ヘッダー ファイルが含まれているためです。
解決策は、ヘッダー ファイル内で関数を宣言する
だけで、関数定義をファイル内に配置することです。具体的には、関数定義をfrom転送します。Base.h
Base.cpp
Base.h
platform()
Base.h
Base.cpp
さらに、ヘッダー ファイルに別の変数が定義されている場合、たとえば、int a = 10;
ヘッダー ファイルがcpp
両方のファイルに含まれているため、同様のエラーが発生します。
解決策は、
変数の定義をBase.cpp
ファイルに入れることです。
概要:ヘッダー ファイルを含むステートメントと関数の宣言
Base.h
のみがファイルに配置され、変数の定義と関数の定義がファイルに配置されます。#include ""
void fun();
Base.cpp
int a = 10;
void fun() { }