複数回定義されているシンボル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
donnbee

複数回定義されているシンボル

#1

投稿記事 by donnbee » 6年前

初心者ですが教えてください。この度game.cppというところにメインゲームのコードを挿入したのですが、エラーが発生してしまいました。メインゲームのコードもお見苦しいところ失礼しますがお願いします。

エラー内容
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK2005 WinMain は既に Game.obj で定義されています。 minigame F:\minigame\minigame\minigame\main.obj 1
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー LNK1169 1 つ以上の複数回定義されているシンボルが見つかりました。 kosensai F:\minigame\minigame\minigame\x64\Debug\minigame.exe 1

コード:

#include "Game.h"
#include "SceneMgr.h"
#include "DxLib.h"
#define SHOT 10000

static int mImageHandle;    //画像ハンドル格納用変数

//初期化
void Game_Initialize() {
	mImageHandle = LoadGraph("images/Scene_Game.png");    //画像のロード
}

//終了処理
void Game_Finalize() {
	DeleteGraph(mImageHandle);    //画像の解放
}

//更新
void Game_Update() {
	if (CheckHitKey(KEY_INPUT_ESCAPE) != 0) { //Escキーが押されていたら
		SceneMgr_ChangeScene(eScene_Menu);//シーンをメニューに変更
	}
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	SetGraphMode(1280, 720, 32);		//画面モードの設定

	int player1, player1X, player1Y;
	int player2, player2X, player2Y;
	int ShotX[SHOT], ShotY[SHOT], ShotFlag[SHOT], ShotGraph;
	int tamaX[SHOT], tamaY[SHOT], tamaFlag[SHOT], tamaGraph;
	int ShotBFlag;
	int tamaBFlag;
	int player2W, player2H, ShotW, ShotH;
	int player1W, player1H, tamaW, tamaH;
	int i, j;


	if (DxLib_Init() == -1)        // DXライブラリ初期化処理
	{
		return -1;        // エラーが起きたら直ちに終了
	}

	// グラフィックの描画先を裏画面にセット
	SetDrawScreen(DX_SCREEN_BACK);

	// 1Pのグラフィックをメモリにロード&表示座標をセット
	player1 = LoadGraph("1p.png");
	player1X = 220; player1Y = 450;

	// 2Pのグラフィックをメモリにロード&表示座標をセット
	player2 = LoadGraph("2p.png");
	player2X = 860; player2Y = 450;

	// 1pの弾のグラフィックをメモリにロード
	ShotGraph = LoadGraph("tama.png");
	// 2pの弾のグラフィックをメモリにロード
	tamaGraph = LoadGraph("tama2.png");

	// 1pの弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく
	for (i = 0; i < SHOT; i++)
	{
		ShotFlag[i] = 0;
	}
	// 2pの弾が画面上に存在しているか保持する変数に『存在していない』を意味する0を代入しておく
	for (j = 0; j < SHOT; j++)
	{
		tamaFlag[j] = 0;
	}

	// ショットボタンが前のフレームで押されたかどうかを保存する変数に0(押されいない)を代入
	ShotBFlag = 0;
	// ショットボタンが前のフレームで押されたかどうかを保存する変数に0(押されいない)を代入
	tamaBFlag = 0;

	// 1p弾のグラフィックのサイズをえる
	GetGraphSize(ShotGraph, &ShotW, &ShotH);
	// 2p弾のグラフィックのサイズをえる
	GetGraphSize(tamaGraph, &tamaW, &tamaH);

	// 1pのグラフィックのサイズを得る
	GetGraphSize(player1, &player1W, &player1H);
	// 2pのグラフィックのサイズを得る
	GetGraphSize(player2, &player2W, &player2H);

	// 移動ルーチン
	while (1)
	{
		// 画面を初期化(真っ黒にする)
		ClearDrawScreen();

		// 1pの操作ルーチン
		{
			// スペースキーを押していて、且弾が撃ち出されていなかったら弾を発射する
			if (CheckHitKey(KEY_INPUT_SPACE))
			{
				// 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射
				if (ShotBFlag == 0)
				{

					// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
					for (i = 0; i < SHOT; i++)
					{
						// 弾iが画面上にでていない場合はその弾を画面に出す
						if (ShotFlag[i] == 0)
						{

							int Bw, Bh, Sw, Sh;

							// 1pと1pの弾の画像のサイズを得る
							GetGraphSize(player1, &Bw, &Bh);
							GetGraphSize(ShotGraph, &Sw, &Sh);

							// 1pの弾iの位置をセット、位置は1pの中心にする
							ShotX[i] = (Bw - Sw) / 2 + player1X;
							ShotY[i] = (Bh - Sh) / 2 + player1Y;

							// 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する
							ShotFlag[i] = 1;
							// 一つ弾を出したので弾を出すループから抜けます
							break;
						}
					}

				}

				// 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入
				ShotBFlag = 1;
			}
			else
			{
				// ショットボタンが押されていなかった場合は
				// 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入
				ShotBFlag = 0;
			}

			// 1pを描画
			DrawGraph(player1X, player1Y, player1, TRUE);
		}

		//2pの操作ルーチン
		{
			// エンターキーを押していて、且弾が撃ち出されていなかったら弾を発射する
			if (CheckHitKey(KEY_INPUT_RETURN))
			{
				// 前フレームでショットボタンを押したかが保存されている変数が0だったら弾を発射
				if (tamaBFlag == 0)
				{

					// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
					for (j = 0; j < SHOT; j++)
					{
						// 2pの弾iが画面上にでていない場合はその弾を画面に出す
						if (tamaFlag[j] == 0)
						{

							int Bw, Bh, Sw, Sh;

							// 2pと2pの弾の画像のサイズを得る
							GetGraphSize(player2, &Bw, &Bh);
							GetGraphSize(tamaGraph, &Sw, &Sh);

							// 2pの弾jの位置をセット、位置は2pの中心にする
							ShotX[j] = (Bw - Sw) / 2 + player2X;
							ShotY[j] = (Bh - Sh) / 2 + player2Y;

							// 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する
							tamaFlag[j] = 1;
							// 一つ弾を出したので弾を出すループから抜けます
							break;
						}
					}

				}

				// 前フレームでショットボタンを押されていたかを保存する変数に1(おされていた)を代入
				tamaBFlag = 1;
			}
			else
			{
				// ショットボタンが押されていなかった場合は
				// 前フレームでショットボタンが押されていたかを保存する変数に0(おされていない)を代入
				tamaBFlag = 0;
			}

			// 2pを描画
			DrawGraph(player2X, player2Y, player2, TRUE);
		}

		// 弾の数だけ弾を動かす処理を繰り返す
		for (i = 0; i < SHOT; i++)
		{

			// 1pの弾の移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
			if (ShotFlag[i] == 1)
			{
				// 弾を20ドット右に移動させる
				ShotX[i] += 20;

				// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
				if (ShotX[i] < -80)
				{
					ShotFlag[i] = 0;
				}

				// 画面に1pの弾iを描画する
				DrawGraph(ShotX[i], ShotY[i], ShotGraph, TRUE);
			}
		}

		// 弾の数だけ弾を動かす処理を繰り返す
		for (j = 0; j < SHOT; j++)
		{

			// 2pの弾の移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
			if (tamaFlag[j] == 1)
			{
				// 弾を20ドット左に移動させる
				tamaX[j] -= 20;

				// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
				if (tamaX[j] < -80)
				{
					tamaFlag[j] = 0;
				}

				// 画面に2pの弾iを描画する
				DrawGraph(tamaX[j], tamaY[j], tamaGraph, TRUE);
			}
		}

		// 弾と敵の当たり判定、弾の数だけ繰り返す
		for (i = 0; i < SHOT; i++)
		{
			// 1pの弾iが存在している場合のみ次の処理に映る
			if (ShotFlag[i] == 1)
			{
				// 2pとの当たり判定
				if (((ShotX[i] > player2X && ShotX[i] < player2X + player2W) ||
					(player2X > ShotX[i] && player2X < ShotX[i] + ShotW)) &&
					((ShotY[i] > player2Y && ShotY[i] < player2Y + player2H) ||
					(player2Y > ShotY[i] && player2Y < ShotY[i] + ShotH)))
				{
					// 接触している場合は当たった弾の存在を消す
					ShotFlag[i] = 0;
				}
			}
		}

		// 弾と敵の当たり判定、弾の数だけ繰り返す
		for (j = 0; j < SHOT; j++)
		{
			// 2pの弾jが存在している場合のみ次の処理に映る
			if (ShotFlag[j] == 1)
			{
				// 1pとの当たり判定
				if (((tamaX[j] > player1X && tamaX[j] < player1X + player1W) ||
					(player1X > tamaX[j] && player1X < tamaX[j] + tamaW)) &&
					((tamaY[j] > player1Y && tamaY[j] < player1Y + player1H) ||
					(player1Y > tamaY[j] && player1Y < tamaY[j] + ShotH)))
				{
					// 接触している場合は当たった弾の存在を消す
					tamaFlag[j] = 0;
				}
			}
		}


		// 裏画面の内容を表画面にコピーする
		ScreenFlip();


		// Windows 特有の面倒な処理をDXライブラリにやらせる
		// -1 が返ってきたらループを抜ける
		if (ProcessMessage() < 0) break;

		// もしESCキーが押されていたらループから抜ける
		if (CheckHitKey(KEY_INPUT_ESCAPE)) break;
	}


	WaitKey();            // キーの入力待ち(『WaitKey』を使用)

	DxLib_End();            // DXライブラリ使用の終了処理

	return 0;            // ソフトの終了
}


コード:

#include "DxLib.h"
#include "SceneMgr.h"
#include "Keyboard.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {//画面更新 & メッセージ処理 & 画面消去

		Keyboard_Update();    //キーボードの更新

		SceneMgr_Update();  //更新
		SceneMgr_Draw();    //描画

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

Math

Re: 複数回定義されているシンボル

#2

投稿記事 by Math » 6年前

ひとつのプログラムにエントリー・ポイント
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
が2個存在してはいけませんね。(ごく初歩的間違いとおもいますよ)

donnbee

Re: 複数回定義されているシンボル

#3

投稿記事 by donnbee » 6年前

返信ありがとうございます!game.cppのほうのエントリー・ポイントを消したところ宣言がありません、等の大量のエラーが出てしまいました。度々すみませんがどうしたらいいでしょうか。

Math

Re: 複数回定義されているシンボル

#4

投稿記事 by Math » 6年前

超初歩的問題ですが そちらを消すとプログラムのロジックがハチャメチャになるからですよ(^^;

donnbee

Re: 複数回定義されているシンボル

#5

投稿記事 by donnbee » 6年前

初歩的なミスばっかりですね...もう少し勉強しなければです。
一応消してみましたがエラーがやはり発生します。度々すみませんがご教授お願いします...。

コード:

#include "DxLib.h"
#include "SceneMgr.h"
#include "Keyboard.h"

//int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {//画面更新 & メッセージ処理 & 画面消去

		Keyboard_Update();    //キーボードの更新

		SceneMgr_Update();  //更新
		SceneMgr_Draw();    //描画

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
//}

box
記事: 2002
登録日時: 13年前

Re: 複数回定義されているシンボル

#6

投稿記事 by box » 6年前

donnbee さんが書きました:一応消してみましたがエラーがやはり発生します。
何というエラーメッセージが出るのか、具体的に記載してください。回答しようとする側は超能力者ではありません(質問者さんのPC画面は見えない)ので、
質問者さんのところで何が起きているかは質問者さんからの情報を頼りにするしかないのです。
まあ、
donnbee さんが書きました:

コード:

//int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
//}
この2行だけをコメントアウトしたら、そりゃエラーが出ますわ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 複数回定義されているシンボル

#7

投稿記事 by へにっくす » 6年前

game.cppだけにしてください。
main.cppは要らないでしょ。

エントリポイントであるWinMainは一つだけです。
game.cppとmain.cppをいっしょにビルドしちゃいけません。
written by へにっくす

返信

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