ページ 11

error LNK2005から脱出できない

Posted: 2012年1月22日(日) 02:41
by ロジ夫
今、あるサイトを見ながらDXライブラリでテトリスを作っている最中です。
うまく出来ているか確認するためにいざ実行してみると、error LNK2005がたくさん出てきました。
そのエラーはこういうものです。

コード:

FPS.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
Init.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
Key.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
Loop.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
CheckOverlap.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
ControlBlock.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
CreateBlock.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
DrawField.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
Initialize.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
LockBlock.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
MoveBlock.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
TurnBlock.obj : error LNK2005: "int (* Block)[4]" (?Block@@3PAY03HA) は既に main.obj で定義されています。
C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Project1\テトリス\Debug\テトリス.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ビルドログは "file://c:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Project1\テトリス\Debug\BuildLog.htm" に保存されました。
テトリス - エラー 13、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
コードの中にはBlockという変数をひとつしか定義していないのに、どういうことでしょうか?
変数と関数などの名前が類似していたりするのはダメだとでも言っているのでしょうか?

以下がコードになります。

コード:

//main.h
#define  GROBAL_INSTANCE
#include "GV.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	Window_Init();

	Initialize();

	while(!ProcessLoop() && !Key.Code[KEY_INPUT_ESCAPE] && !GameOver){

		ControlBlock();

		if(Count%240==0){
			if(!CheckOverlap(Block_X,Block_Y+1))
			MoveBlock(Block_X,Block_Y+1);

			else{
				LockBlock();
				CreateBlock();
			}
		}

		DrawField();
		SetDrawFPS(TRUE);
	
	}
	DxLib_End();
	return 0;
}

コード:

//GV.h
#include "DxLib.h"
#include "Define.h"

#ifdef GROBAL_INSTANCE
#define GROBAL
#else
#define GROBAL extern
#endif

#include "Function.h"
#include "BV.h"

GROBAL Key_t Key;
GROBAL FPS_t FPS;

GROBAL int Stage[FieldSize_Y][FieldSize_X];
GROBAL int Field[FieldSize_Y][FieldSize_X];
GROBAL int Block_X;
GROBAL int Block_Y;
GROBAL int GameOver;
GROBAL int Count;

コード:

//BV.h(ブロック変数(BlockVariable)の用意と初期化)
GROBAL int Block[BlockSize_X][BlockSize_Y]=
{
	{0,0,0,0},
	{0,1,1,0},
	{0,1,1,0},
	{0,0,0,0},
};

コード:

//Function.h
GROBAL void KeepSpeedManagement();   //処理を一定の速度に保つ
GROBAL void SetDrawFPS(int);         //FPS表示のON/OFF
GROBAL int  GetHitKeyStateAll_2();      //キー入力1
GROBAL int  CheckHitKeyAll_2();        //キー入力2
GROBAL int  Window_Init();           //MessageBoxやDxLib_Initなどの纏め
GROBAL int  ProcessLoop();            //ループ内に必要な関数の纏め

GROBAL void Initialize();          //変数初期化
GROBAL int  CreateBlock();         //ブロック生成
GROBAL void DrawField();         //フィールド描画
GROBAL void MoveBlock(int,int);     //ブロック移動処理
GROBAL int  CheckOverlap(int,int);   //障害物確認
GROBAL void LockBlock();         //ブロックを障害物化
GROBAL void ControlBlock();        //ブロック操作処理
GROBAL int  TurnBlock();          //ブロック回転処理

Re: error LNK2005から脱出できない

Posted: 2012年1月22日(日) 02:48
by ロジ夫
すみません、理由がわかりました。

GROBAL 型名 で用意した変数を同時に初期化することはできないですね。
でもそれができないとなったらブロック変数はどうやって初期化すべきなのでしょうか・・・?

Re: error LNK2005から脱出できない

Posted: 2012年1月22日(日) 08:34
by beatle
extern宣言したグローバル変数を初期化できないというのは当たりまえのことです.
extern宣言は「具体的な場所は知らないけれど,どこかで定義されていますよ!」という意味ですから.
externなしで定義されている場所で初期化する必要があります.

Re: error LNK2005から脱出できない

Posted: 2012年1月22日(日) 09:23
by ロジ夫
自己解決しました、ありがとうございました。