Visual Studio 2008 Express EditionとDXライブラリを使って、ゲーム(と呼べるレベルのものではまだありませんが)を作っています。
ソースファイルを分割しようとしてみたところ、つぎの様なエラーメッセージがでて、その解決方法が分からなくなって困っています。
以下エラーメッセージです。
1>------ ビルド開始: プロジェクト: Game2, 構成: Debug Win32 ------
1>コンパイルしています...
1>char.cpp
1>main.cpp
1>コードを生成中...
1>リンクしています...
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16 で参照されました。
1>C:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\Game2\Debug\Game2.exe : fatal error LNK1120: 外部参照 1 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\Game2\Game2\Debug\BuildLog.htm" に保存されました。
1>Game2 - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16
↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直しwin32 コンソールアプリケーションを選んで、"stdafx.h"をchar.ccpとgame3.ccpに追加した以外は全く同じコードで試してみたところ、以下のようなエラーメッセージがでました。
1>------ ビルド開始: プロジェクト: game3, 構成: Debug Win32 ------
1>コンパイルしています...
1>game3.cpp
1>c:\documents and settings\ryosuke\my documents\visual studio 2008\projects\game3\game3\game3.cpp(9) : fatal error C1083: include ファイルを開けません。'Keys_Blocks.h': No such file or directory
1>ビルドログは "file://c:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\game3\game3\Debug\BuildLog.htm" に保存されました。
1>game3 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
無事にコンパイルできるようにするにはどうしたらいいかご教授ください。
ファイルを分割してみたらエラーが消えなくなってしまいました。
Re:ファイルを分割してみたらエラーが消えなくなってしまいました。
以下はソースファイルです。
//game3.ccpとmain.ccpは始めの一行以外は同じものです。 #include "stdafx.h" #include "DxLib.h" #include "Keys_Blocks.h" void char_coord(int *Key,int block); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(TRUE);//ウィンドウモード if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化 //Loading pics int back_i=0; int ground=LoadGraph("Stones.png"); while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){ //↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない //Back LoadGraphScreen(-back_i,0,"virgo.jpg",FALSE); if(back_i>1080-680)LoadGraphScreen(1080-back_i,0,"virgo.jpg",FALSE); if(back_i>1080)back_i=0; back_i++; //Ground int ground=LoadGraph("stones.png"); for(int i=0;i<20;i++){ for(int j=0;j<15;j++){ if(block[j]==1)DrawGraph(i*32,j*32,ground,TRUE); } } //draw_char char_coord(Key,block[15][20]); ScreenFlip(); } DxLib_End(); return 0; } //char.ccp #include "stdafx.h" #include "DxLib.h" #include <math.h> #define g 6.6 #define y_max 2.0 typedef struct{ int x; int y; int img; int direct;//right 1 or left 3 int inertia; int j_flag; int sky; }cha; void char_coord(int *Key,int block[15][20]){ //int *coord; int dora[12]; LoadDivGraph("char.png",12,3,4,24,32,dora); cha ch; ch.x=680/4; ch.y=480-32*4; ch.direct=1; ch.inertia=0; ch.j_flag=0; ch.sky=0; int ex_y=ch.y; int time1=0,time2=0; double t; //char_x if(Key[KEY_INPUT_RIGHT]>0){ if(ch.sky==1)ch.x+=4;//accerate in the sky ch.x+=3,ch.direct=1;//start walking } if(Key[KEY_INPUT_RIGHT]>10)ch.x+=4,ch.inertia=10;//start running and get inertia force if(ch.direct==1 && Key[KEY_INPUT_RIGHT]==0 && ch.inertia==10)ch.inertia--;//inertia force is weakening if(ch.direct==1 && ch.inertia<10 && ch.inertia>0)ch.x+=2,ch.inertia--; if(Key[KEY_INPUT_LEFT]>0){ if(ch.sky==1)ch.x-=4; ch.x-=3,ch.direct=3; } if(Key[KEY_INPUT_LEFT]>10)ch.x-=4,ch.inertia=10; if(ch.direct==3 && Key[KEY_INPUT_LEFT]==0 && ch.inertia==10)ch.inertia--; if(ch.direct==3 && ch.inertia<10 && ch.inertia>0)ch.x-=2,ch.inertia--; //char_jump if(Key[KEY_INPUT_UP]==1 && ch.j_flag<=2){ time1=GetNowCount(); ch.j_flag++; //up flag ex_y=ch.y; //where it was } if(ch.j_flag!=0){ time2=GetNowCount(); t=(double)(time2-time1)/1000; ch.y=ex_y-(int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max);//culc y if((int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max)>0)ch.sky=1; if(block[ch.y/32+1][ch.x/32+1]==1 && ch.sky==1){ ch.y=(ch.y/32)*32;//discard fractions ch.j_flag=0; ch.sky=0; } } ch.img=dora[((ch.x+ch.y)%12)/4+ch.direct*3];//choosing picture based on coordinates if(ch.x>400){ ch.x=400;//cant move right anymore ch.img=dora[(Key[KEY_INPUT_RIGHT]+Key[KEY_INPUT_UP])%3+3];//choosing picture based on KEY_INPUT_RIGHT time } DrawGraph(ch.x,ch.y,ch.img,TRUE); //coord[0]=ch.x; //coord[1]=ch.y; //return 0; }
Re:ファイルを分割してみたらエラーが消えなくなってしまいました。
//Keys_Blocks.h
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}
int block[15][20] = {
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
[/pre]
長くなってすいません。
よろしくお願いします!
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}
int block[15][20] = {
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
[/pre]
長くなってすいません。
よろしくお願いします!
Re:ファイルを分割してみたらエラーが消えなくなってしまいました。
> error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16
> ↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直し
この対応は間違いです、元に戻してください。
未解決シンボルエラーになるのはプロトタイプ宣言と関数の実体の定義が一致していないからです。
プロトタイプ:void char_coord(int *Key,int block);
関数宣言:void char_coord(int *Key,int block[15][20]){
関数のほうの [15][20]はいらないのでは?
> ↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直し
この対応は間違いです、元に戻してください。
未解決シンボルエラーになるのはプロトタイプ宣言と関数の実体の定義が一致していないからです。
プロトタイプ:void char_coord(int *Key,int block);
関数宣言:void char_coord(int *Key,int block[15][20]){
関数のほうの [15][20]はいらないのでは?
Re:ファイルを分割してみたらエラーが消えなくなってしまいました。
関数の定義や多次元配列を見直したところ、無事コンパイルできました!
Mistさん、本当にありがとうございます!!!
Mistさん、本当にありがとうございます!!!