このエラーが発生する要因を教えてください。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wwhariJP
記事: 3
登録日時: 8年前

このエラーが発生する要因を教えてください。

#1

投稿記事 by wwhariJP » 8年前

LNK2005エラーは変数、関数の重複定義だと調べて分かったのですが
このサイトに乗っている範囲でdxライブラリを使ったプログラミングを勉強しているため
私はWinMainに関してはあくまでおまじない程度の把握しかしていなく、
WinMain関数を自力で定義したり、WinAPI,DXライブラリのヘッダファイルの変更は一切しておりませんでした。
ちなみにこのエラーが起こり始めたのはメイン関数周辺でグローバルなキーボード入力の配列を定義したあたりからです。(そこまではコンパイル、実行は通っていた)

エラー 1 error LNK2005: _WinMain@16 は既に Main.obj で定義されています。
エラー 2 error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

コード:

/*----Main.cpp----*/
#include "DxLib.h"
#include "Keyboard.h"
#include"SceneMgr.h"

void message_box(){
	int flag;
	flag = MessageBox(
		NULL,
		TEXT("フルスクリーンモードで起動しますか?"),
		TEXT("スクリーン設定"),
		MB_YESNO | MB_ICONQUESTION);
	if (flag == IDNO)
		ChangeWindowMode(TRUE);
}

int count = 0;
void wait_fanc(){
	int term;
	static int t = 0;
	term = GetNowCount() - t;
	if (16 - term>0)
		Sleep(16 - term);
	t = GetNowCount();
	return;
}
void fps(){
	int i;
	static int t = 0, ave = 0, f[60];

	f[count % 60] = GetNowCount() - t;
	t = GetNowCount();
	if (count % 60 == 59){
		ave = 0;
		for (i = 0; i<60; i++)
			ave += f[i];
		ave /= 60;
	}
	if (ave != 0){
		DrawFormatString(0, 430, GetColor(255, 255, 255), "%.1fFPS", 1000.0 / (double)ave);
	}
	return;
}

int Key[256];

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	message_box();
	DxLib_Init();
	SceneMgr_Initialize();

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){

		gpUpdateKey();
		SceneMgr_Update();
		SceneMgr_Draw();
		count++;
		fps();
	}
	SceneMgr_Finalize();
	DxLib_End();
	return 0;
}


/*SceneMgr.h*/
#pragma once

typedef enum{
	eScene_Menu,//メニュー画面
	eScene_Game,//ゲーム画面
	eScene_Config,//設定画面

	eScene_None,//何もなし

}eScene;

void SceneMgr_Initialize();//初期化
void SceneMgr_Finalize();//終了処理
//更新
void SceneMgr_Update();
//描画
void SceneMgr_Draw();

//nextScene にシーンを変更
void SceneMgr_ChangeScene(eScene nextScene);

/*-----Keyboard.h------*/
#pragma once

// キーの入力状態を更新する
void gpUpdateKey();

extern int Key[256];  // キーの入力状態格納用変数

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: このエラーが発生する要因を教えてください。

#2

投稿記事 by softya(ソフト屋) » 8年前

エラーメッセージ通りです。
> エラー 1 error LNK2005: _WinMain@16 は既に Main.obj で定義されています。
WinMain関数がMain.cpp以外にも存在している多重定義であると言うことです。
本人にそのつもりがなくてもコピペミスなど幾らでも発生する可能性はあります。
全ソースコードを提示してもらっていないので見せてもらっているものは問題ないとしか言えませんが、主観に基づく推測ではなく全ファイル検索など客観的な調査方法を取ることをおすすめします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

wwhariJP
記事: 3
登録日時: 8年前

Re: このエラーが発生する要因を教えてください。

#3

投稿記事 by wwhariJP » 8年前

ご返信ありがとうございました。
フォーラムルールのテンプレートに沿わない形で質問をしてしまったことをお詫びいたします。

>全ファイル検索
当方visualstudio2013 Express forWindowsDesktopを使用しております。
編集タブ->検索と置換で検索範囲をソリューション全体にし、検索する文字列を「WinMain」で検索したところ
Main.cppの中のWinMain関数のこの一行以外に一致するものはありませんでした。
また、WinMain関数の全ての参照先も検索したところ、Main.cppファイルの中のこの一行、外部依存関係を除き、その他全ての自前のソースファイル、ヘッダファイル内にもWinMain関数はありませんでした。
浅学な身で恐縮ではありますが、他に何か取れる手段はあるのでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: このエラーが発生する要因を教えてください。

#4

投稿記事 by softya(ソフト屋) » 8年前

ありませんでしたか。でも、これで客観的に問題が絞り込めました。
何らかの問題が起こらないと発生しない事態だと思いますが、再ビルドをまず試してみて頂いて、
それでもダメならプロジェクトのDebugフォルダを削除してビルドしなおしてみてください。2箇所あるので確実に削除をお願いします。
VisualStudioやパソコンの予期せぬ終了やフリーズが原因の場合や、ウィルス対策ソフトが悪さをする場合もあるようです。

それでも治らない場合は、プロジェクトを再作成してみる必要があるかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

wwhariJP
記事: 3
登録日時: 8年前

Re: このエラーが発生する要因を教えてください。

#5

投稿記事 by wwhariJP » 8年前

迅速なご返信ありがとうございます。
>プロジェクトのDebugフォルダを削除
これを実行した結果、無事コンパイルに成功、実行することができました。
懇切丁寧なご指導、心より感謝いたします。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る