[Visual Studio] エラー LNK2005: _main が .obj に定義されている、またはエラー LNK1165: 1 つ以上の再定義されたシンボルが見つかりました。、環境背景は C++ を使用して Qt を開発することです。

知識は単独のものではなく、体系化されたものでなければなりません。私の個人的な概要と関連する経験の詳細については、このコラム「 Visual Studio」を参照してください

記事ディレクトリ

質問

他の人が検索時に私の記事を取得できるように、エラー メッセージをコピーします。エラーメッセージは次のとおりです。

重大度 コード 説明 プロジェクト ファイル行の抑制 ステータス
エラー LNK2005 「class NatNetClient * g_pClient」 (?g_pClient@@3PEAVNatNetClient@@EA) は SampleClient.obj にすでに定義されています GUISample C:\Users\jicha\source\repos\GUISample\GUISample.obj 1


エラーのスクリーンショットは次のとおりです。

ここに画像の説明を挿入


解決

これは、次のようなさまざまな理由で発生する可能性があります。

  1. 現在のソリューションまたはプロジェクト ファイルに複数の main() 関数、つまり 2 つのプログラム エントリが表示されます。
  2. グローバル変数の重複定義
  3. サードパーティライブラリの使用によって発生するライブラリ間の競合
  4. ヘッダーファイルの重複インクルード

ここで遭遇したのは 4 番目のケースなので、主に 4 番目の論理構造を示します。

Base.hBase.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.hplatform()Base.hBase.cpp

さらに、ヘッダー ファイルに別の変数が定義されている場合、たとえば、int a = 10;ヘッダー ファイルがcpp両方のファイルに含まれているため、同様のエラーが発生します。

解決策は、
変数の定義をBase.cppファイルに入れることです。

概要:ヘッダー ファイルを含むステートメントと関数の宣言
Base.hのみがファイルに配置され変数の定義と関数の定義がファイルに配置されます#include ""void fun();
Base.cppint a = 10;void fun() { }


参照。

  1. LNK2005: _main はソース .obj ですでに定義されています。または LNK1165: 1 つ以上の再定義されたシンボルが見つかりました。
  2. エラー LNK2005: 「1 つ以上の多重定義されたシンボルが見つかりました」ソリューションは main.obj ですでに定義されています

おすすめ

転載: blog.csdn.net/weixin_36815313/article/details/131672841