error LNK2005について

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

error LNK2005について

#1

投稿記事 by LLL » 14年前

こにんちは
1度簡単なゲームを作成し
第2弾を作ろうとしたところ error LNK2005に悩まされております
構造体の2重定義が原因のようなのですが解決策が分からないため質問させて頂きます。
お力をおかしください

ヘッダ
heard.h

コード:

#include "DxLib.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

#include "variable.h"

#define PLAYER_X 200
#define PLAYER_Y 200

//関数
GLOBAL void load_main();
GLOBAL int get_move_key();
GLOBAL void game_main();
struct.h

コード:

struct Player{
	 int Grun[4];//走りグラ
	 int Grun2[4];//走りその2
	 int Attack;//たちグラ
	 int Px,Py;//プレイヤーの場所
} player_t;
variable.h

コード:

#include "struct.h"

GLOBAL int Game_Kind;//ゲームの場所(タイトル等々)
GLOBAL int GrN;//走りグラの判別

コード
main.cpp

コード:

#define GLOBAL_INSTANCE
#include "head.h"


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

        // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

			if(Game_Kind == 0){

				load_main();

			}
			else if(Game_Kind == 1){

				game_main();
				
			}


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

コード:

#include "head.h"

char Buf[ 256 ] ;

int get_move_key(){

	if(CheckHitKeyAll() != 0){
	
		GetHitKeyStateAll( Buf ) ;
		if( Buf[ KEY_INPUT_RIGHT ] == 1 )
		{
			return 1;
		}
		
		if( Buf[ KEY_INPUT_LEFT ] == 1 )
		{
			return 2;
		}

	}
	return 0;
}
load.cpp

コード:

#include "head.h"

void load_main(){
	// 透過色を変更
	SetTransColor( 255 , 0 , 255 ) ;
	//素材を読み込み
	LoadDivGraph( "素材/run.bmp" ,4 ,4 ,1 ,48 ,60 ,player_t.Grun ) ;
	LoadDivGraph( "素材/run2.bmp" ,4 ,4 ,1 ,48 ,60 ,player_t.Grun2 ) ;
	player_t.Attack = LoadGraph("素材/attack.bmp");
	//初期化
	player_t.Px = PLAYER_X;
	player_t.Py = PLAYER_Y;

	Game_Kind = 1;
}
move.cpp

コード:

#include "head.h"

void run(){	
 

	if(get_move_key() == 1){
		GrN++;
		player_t.Px++;
		DrawGraph( player_t.Px , player_t.Py , player_t.Grun2[GrN%4] , TRUE ) ;
		
	}
	if(get_move_key() == 2){
		GrN++;
		player_t.Px--;
		DrawGraph( player_t.Px , player_t.Py , player_t.Grun[GrN%4] , TRUE ) ;
		
	}
	if(get_move_key() == 0){
		
		DrawGraph( player_t.Px , player_t.Py , player_t.Attack , TRUE ) ;
		GrN=0;
	}
}

void game_main(){
	run();
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: error LNK2005について

#2

投稿記事 by beatle » 14年前

エラーメッセージは,「すべてを,そのまま」貼りつけてください.
エラーメッセージの中には行数なども書かれていますので,非常に重要な情報です.

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: error LNK2005について

#3

投稿記事 by beatle » 14年前

想像するに,ヘッダの2重読み込みが問題なのではないでしょうか.
2重インクルードガードというものを学習してください.

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

Re: error LNK2005について

#4

投稿記事 by box » 14年前

LLL さんが書きました: 第2弾を作ろうとしたところ error LNK2005に悩まされております
構造体の2重定義が原因のようなのですが解決策が分からないため質問させて頂きます。
リンク時にどんなエラーメッセージが出るか、見せてほしいなぁ、と思います。
LLL さんが書きました:

コード:

GLOBAL struct Player{
	 int Grun[4];//走りグラ
	 int Grun2[4];//走りその2
	 int Attack;//たちグラ
	 int Px,Py;//プレイヤーの場所
} player_t;
と修正すれば直るかもしれませんし、直らないかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: error LNK2005について

#5

投稿記事 by box » 14年前

あとは、beatleさんが書かれた、多重インクルードに関する策をとるか、でしょうかねぇ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

LLL

Re: error LNK2005について

#6

投稿記事 by LLL » 14年前

エラーコードを貼り忘れていました
申し明けありません
コードは以下のとおりです

1>load.obj : error LNK2005: "struct Player player_t" (?player_t@@3UPlayer@@A) は既に key.obj で定義されています。
1>main.obj : error LNK2005: "struct Player player_t" (?player_t@@3UPlayer@@A) は既に key.obj で定義されています。
1>move.obj : error LNK2005: "struct Player player_t" (?player_t@@3UPlayer@@A) は既に key.obj で定義されています。
1>C:\Users\ken\Documents\Visual Studio 2008\Projects\ゲーム第2弾\Debug\ゲーム第2弾.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
1>ビルドログは "file://c:\Users\ken\Documents\Visual Studio 2008\Projects\ゲーム第2弾\Debug\BuildLog.htm" に保存されました。
1>ゲーム第2弾 - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: error LNK2005について

#7

投稿記事 by beatle » 14年前

ああ,なるほど.

コード:

struct Player{
     int Grun[4];//走りグラ
     int Grun2[4];//走りその2
     int Attack;//たちグラ
     int Px,Py;//プレイヤーの場所
} player_t;
player_tという名前なので,すっかりtypedef名かと思ってたら勘違いでした.
普通,_tというのは,型名に使うんです.こんなふうに.

コード:

typedef struct Player{
     int Grun[4];//走りグラ
     int Grun2[4];//走りその2
     int Attack;//たちグラ
     int Px,Py;//プレイヤーの場所
} player_t;
グローバル変数の「定義」と「宣言」をしっかり区別してください.
extern宣言は何回してもいいのですが,変数の実体の定義はどれかの.cファイルで1回だけしかしてはいけません.

ということで,boxさんがいうようにGLOBALをつければいいですね.
でも_tという名前は止めた方がいいですけどね.

LLL

Re: error LNK2005について

#8

投稿記事 by LLL » 14年前

無事エラーを回避することが出来ました
ありがとうございます
命名の法則などもっと勉強したいと思います

閉鎖

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