LNK2005が出て困っています

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

LNK2005が出て困っています

#1

投稿記事 by ti » 15年前

MAKETOWNが原因でリンクエラーがでているのだとおもうのですが原因がわかりません原因と思われる場所をどう直せばいいか教えてください

1>main.obj : error LNK2005: "void __cdecl MAKETOWN(void)" (?MAKETOWN@@YAXXZ) は既に make town.obj で定義されています。
1>C:\Documents and Settings\ti\My Documents\Visual Studio 2005\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\DxLib_VC2005用.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

[2] 環境  
 [2.1] OS : Windows XP Home
 [2.2] コンパイラ名 : VC++ 2005SE
[3] その他
 ・基本的なことはわかっているとおもいます
 ・DxLib.hを使用しています
 


ソースコードです
main.cpp
//#include "DxLib.h"

#include "make town.cpp" 

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    
	// 画面モードの変更
	SetGraphMode( 320 , 320 , 16 ) ;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

    SetDrawScreen( DX_SCREEN_BACK ) ;  //描画先を裏画面に設定

	void MAKETOWN(void);

 
    DxLib_End();
    return 0;
}

make town.cpp

#include "DxLib.h"
//街生成
//void MAKETOWN(void);

void MAKETOWN(void)
{

	int cr_x=16,cr_y=38;//位置の初期値
	int image,cr1;
	char Key[256];
	int i,j;
	image = LoadGraph( "1138.obp" ) ;
	SetTransColor( 255 , 0 , 255 ) ;//透過させたいファイルを読む前に透過色を設定する必要アリ
	cr1 = LoadGraph( "cr.obp" );
	
	//画像を分割してimage配列に保存
	i=96;//xの初期値
	j=432;//yの初期値
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
			
			//for(j=1; i<16; j++){	//j=x I=y
		if( Key[ KEY_INPUT_UP ]  == 1 ){  //上ボタンが押されたら
			if(ariahan_hantei[cr_y-1][cr_x]==0 || ariahan_hantei[cr_y-1][cr_x]==3)//許可もしくはマップ切り替えなら
			{
				j=j-16;
				cr_y=cr_y-1;
				WaitTimer( 50 ) ;//動作がはやいので0.5秒まつ
			}
		}
		if( Key[ KEY_INPUT_LEFT ]  == 1 ){  //左ボタンが押されたら
			if(ariahan_hantei[cr_y][cr_x-1]==0)
			{
				//if(i%16==0)
				//i--;
				
				i=i-16;
				cr_x=cr_x-1;
				WaitTimer( 50 ) ;//動作がはやいので0.5秒まつ
			}
			
		}
		if( Key[ KEY_INPUT_DOWN ]  == 1 ){  //下ボタンが押されたら
			if(ariahan_hantei[cr_y+1][cr_x]==0)
			{
				j=j+16;
				cr_y=cr_y+1;
				WaitTimer( 50 ) ;//動作がはやいので0.5秒まつ
			}
		}
		if( Key[ KEY_INPUT_RIGHT ]  == 1 ){  //右ボタンが押されたら
			if(ariahan_hantei[cr_y][cr_x+1]==0)
			{
				i=i+16;
				cr_x=cr_x+1;
				WaitTimer( 50 ) ;//動作がはやいので0.5秒まつ
			}
			
		}
		
		DrawRectGraph( 0, 0, i, j, 320, 320, image, TRUE, FALSE ) ;//x=0y=0の位置にimageのx128y640から320づつ描写
		
		
		DrawRectGraph( 160, 160, 0, 0, 16, 24, cr1, TRUE, FALSE ) ;	//中央にキャラ描写
		
		ScreenFlip();//裏画面を表画面に反映
		
		//return 0;
    }
}
 

1>main.obj : error LNK2005: "void __cdecl MAKETOWN(void)" (?MAKETOWN@@YAXXZ) は既に make town.obj で定義されています。
1>C:\Documents and Settings\ti\My Documents\Visual Studio 2005\DxLib_VC\サンプルプログラム実行用フォルダ\Debug\DxLib_VC2005用.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

[2] 環境  
 [2.1] OS : Windows XP Home
 [2.2] コンパイラ名 : VC++ 2005SE
[3] その他
 ・基本的なことはわかっているとおもいます
 ・DxLib.hを使用しています
 
MAKETOWNが原因でリンクエラーがでているのだとおもうのですが原因がわかりません原因と思われる場所をどう直せばいいか教えてください

Naohiro19

Re:LNK2005が出て困っています

#2

投稿記事 by Naohiro19 » 15年前

おそらくリンクエラーになるのはプロトタイプ宣言のがないからだと思います。

以下にコードを示します。
#include <stdio.h>

int main()
{
    putmessage("test\n"); //プロトタイプ宣言がないためエラー
    return 0;
}

ti

Re:LNK2005が出て困っています

#3

投稿記事 by ti » 15年前

Naohiroさん書き込みありがとうございます

main.cppやプロトタイプ宣言を追加してみたりはしたのですが症状がかわりません
文字が多いのかエラーになるので何度かにわけてもういちどソース載せてみます
//#include "DxLib.h"

#include "make town.cpp" 
void MAKETOWN(void);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    
	

	
	
	//ariahan_hantei[11][39]
    //char Key[256];
	//int i,j;
	// 画面モードの変更
	SetGraphMode( 320 , 320 , 16 ) ;
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

    SetDrawScreen( DX_SCREEN_BACK ) ;  //描画先を裏画面に設定

	void MAKETOWN(void);

 
    DxLib_End();
    return 0;
}
make town.cpp
#include "DxLib.h"

//街生成
//void MAKETOWN(void);




void MAKETOWN(void)
{
	//判定ルール0:通れる 1:通過付加 2:イベントあり 3:MAP切り替え
	int ariahan_hantei[63][45]={
	};

Justy

Re:LNK2005が出て困っています

#4

投稿記事 by Justy » 15年前


>MAKETOWNが原因でリンクエラーがでているのだとおもうのですが原因がわかりません

 main.cppで make town.cppをインクルードしているので、MAKETOWNという関数が
main.cppと make town.cppの両方で定義されてしまっているのが原因です。

 通常よほどの理由がない限り、cppファイルをインクルードすることはありません。
 代わりに、MAKETOWN関数のプロトタイプ宣言を書いたヘッダ make town.hを作り、
それをインクルードするといいでしょう。


ついでに main関数の
[color=#d0d0ff" face="monospace]
void MAKETOWN(void);
[/color]

は MAKETOWN関数を呼び出してるつもり、なのかもしれませんがこれでは MAKETOWN関数は
実行されませんので、注意して下さい。

ti

Re:LNK2005が出て困っています

#5

投稿記事 by ti » 15年前

Justyさん
ありがとうございました
おかげで解決できました
C言語は業務で半年ほどやっていましたが新たに.cや.cppファイルをつくったらインクルードするものだと思っていました

>void MAKETOWN(void);
これも戻り値を変更してなんとか実行できるようになりました

自分の中でドラクエみたいなゲームをつくってみようとおもっていまして今後も初歩的なことを質問すると思いますがよろしくお願いします

Naohiro19さん、Justyさんありがとうございました

閉鎖

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