ページ 11

13章について未定義の外部シンボルエラー

Posted: 2013年3月28日(木) 23:28
by イセミト
初めましての人は初めまして。イセミトです。
つい二日ほど前に構文エラーで質問させていただき、解決させていただきました。
が、その後に新たなエラーが発生し、Google先生の助けも借りてなんとか自力で解決しようとしたのですが挫折してしまいました。

【エラー内容1】
エラー 1 error LNK2019: 未解決の外部シンボル "int __cdecl DxLib::DrawRotaGraphF(double,double,double,double,int,int,int)" (?DrawRotaGraphF@DxLib@@YAHNNNNHHH@Z) が関数 "void __cdecl graph_ch(void)" (?graph_ch@@YAXXZ) で参照されました。 C:\Users\Public\Documents\仮置き場\project\1章\graph.obj RyuJin

【エラー内容2】
エラー 2 error LNK1120: 外部参照 1 が未解決です。 C:\Users\Public\Documents\仮置き場\project\1章\Debug\RyuJin.exe 1 1 RyuJin

Google先生によるとこれは「「graph_ch」という関数が定義されてねぇよ」って言われてるんだと解釈できますが、
ソースコードを見る限りちゃんと定義しているはずだし、そもそも定義されているのはDXライブラリのほうなので、
呼び出し方に問題があるのでは、と。

コード:


//graph.cpp

#include "../include/GV.h"

//キャラクタの描画関数
void graph_ch()
{
	DrawRotaGraphF(
		ch.x+FIELD_X,
		ch.y+FIELD_Y,
		1.0f,
		0.0f,
		img_ch[0][ch.Image],
		true
		);
}

//敵の描画関数
void graph_enemy()
{
	int i;
	for(i = 0; i < ENEMY_MAX; i++)
	{
		if(Enemy[i].Flag  ==  1)
		{
			DrawRotaGraphF(Enemy[i].x+FIELD_X,Enemy[i].y+FIELD_Y,1.0f,0.0f,img_enemy[0][Enemy[i].Image],true);
		}
	}
}

//背景枠の描画関数
void graph_board()
{
        DrawGraph(  0,  0,img_board[10],false);	//枠上
        DrawGraph(  0, 16,img_board[11],false);	//枠左
        DrawGraph(  0,464,img_board[12],false);	//枠下
        DrawGraph(416,  0,img_board[20],false);	//枠右
}

//弾の描画
void graph_bullet()
{
	int i,j;
    SetDrawMode( DX_DRAWMODE_BILINEAR ) ;//線形補完描画
    //敵の弾幕数分ループ
	for(i=0;i<SHOT_MAX;i++)
	{
		//弾幕データがオンなら
        if(Shot[i].Flag > 0)
		{
			//その弾幕が持つ弾の最大数分ループ
            for(j = 0; j < SHOT_BULLET_MAX; j++)
			{
				//弾データがオンなら
                if(Shot[i].Bullet[j].Flag != 0)
				{
					if(Shot[i].Bullet[j].Eff == 1)
					{
						//描画ブレンドモードをセットする
						SetDrawBlendMode( DX_BLENDMODE_ADD, 255);
					}

					//弾の回転描画
                    DrawRotaGraphF(
						Shot[i].Bullet[j].x + FIELD_X, Shot[i].Bullet[j].y + FIELD_Y,		//敵弾の座標
						1.0, Shot[i].Bullet[j].Angle + PI/2,								//角度
						Image_Bullet[Shot[i].Bullet[j].Kind][Shot[i].Bullet[j].Color],true	//画像と回転有効の有無
						);

                   if(Shot[i].Bullet[j].Eff == 1)
				   {
					   //描画ブレンドモードをセットする
						SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0);
				   }
               }
            }
        }
    }
	SetDrawMode(DX_DRAWMODE_NEAREST);//描画形式を戻す
}

//描画関数の呼び出し
void graph_main()
{
	graph_enemy();
    graph_ch();
    graph_bullet();
    graph_board();
}

コード:


//function.h

//graph.cppからの呼び出し
        //描画メイン
        GLOBAL void graph_main();

//key.cppからの呼び出し
        //現在のキー入力処理を行う
        GLOBAL int GetHitKeyStateAll_2();
        //受け取ったキー番号の現在の入力状態を返す
        GLOBAL int CheckStateKey(unsigned char Handle);
		//パッドとキーボードの両方の入力をチェックする
		GLOBAL void GetHitPadStateAll();
		//されたパッドキー番号の入力状態を返す。返り値が-1なら不正
		GLOBAL int CheckStatePad(unsigned int Handle);

//laod.cppからの呼び出し
        //データのロード
        GLOBAL void Load();
		//ファイルのロード
		GLOBAL void Load_Story();

//ini.cppからの呼び出し
		//初期化
		GLOBAL void First_Ini();
		GLOBAL void Ini();

//char.cppからの呼び出し
		//アニメーション計算
		GLOBAL void Calc_ch();
		//移動処理
		GLOBAL void ch_Move();

//enemy.cppからの呼び出し
		//敵情報
		GLOBAL void Enemy_Main();

//shot.cppからの呼び出し
		//n番目のショットを登録した敵と自機との角度を返す
        GLOBAL double ShotAtan2(int n);
		//空いている弾を探す
        GLOBAL int Shot_Search(int n);
		//「shot.cpp」内で定義した関数をまとめて呼び出す
        GLOBAL void Shot_Main();

//music.cpp
		//初期化
        GLOBAL void Music_Ini();
		//再生
        GLOBAL void Music_Play();

コード:


//main.cpp

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//メインループ関数
int ProcessLoop()
{
	//プロセス処理がエラーなら-1を返す
	if(ProcessMessage()!=0)
	{
		return -1;
	}

	//画面クリア処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)
	{
		return -1;
	}

	GetHitPadStateAll();	//現在のパッド入力処理を行う
    GetHitKeyStateAll_2();	//現在のキー入力処理を行う

    return 0;
}

//フォーム画面の処理
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    ChangeWindowMode(true);//ウィンドウモードに設定

	//初期化か裏画面化が行われていなかったら
    if(DxLib_Init()  ==  -1 || SetDrawScreen( DX_SCREEN_BACK )!=0)
	{
		//初期化と裏画面化
		return -1;
	}

	//メインループ関数がエラーを出していなかったら
    while(ProcessLoop() == 0)
	{
		Music_Ini();
		switch(func_state)
		{
			case 0:
				Load();				//画像を読み込む
				First_Ini();		//初期化関数の呼び出し
				func_state = 99;	//次の処理へ移行
				break;

			case 99://STGを始める前に行う初期化
				Ini();
				Load_Story();
                func_state=100;
                break;

			case 100:
				Calc_ch();			//キャラクタアニメーション処理
				ch_Move();			//キャラクタの移動制御
				Enemy_Main();		//敵情報
				Shot_Main();		//ショットメイン
				graph_main();		//描画関数呼び出し
				Stage_Count++;
				break;

			default:
				printfDx("不明なfunc_stateです。\n変数が不正に書き換えられていないか確認して下さい。");
				break;
		}
		Music_Play();

		//エスケープキーが押されたらブレイク(プログラム終了)
        if(CheckStateKey(KEY_INPUT_ESCAPE) == 1)
		{
			break;
		}
        ScreenFlip();//裏画面反映
    }

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

とりあえずここに問題があるのではと思われるソースコードを載せておきました。
この中になにか呼び出しで問題のある所はございますでしょうか?
私が探した限りではどこが問題なのか理解が及ばず、申し訳ないです。

因みに、試しに「graph_ch()」をコメントアウトしてみると、今度は「graph_enemy()」が定義されてねえよと怒られました。

何卒助言をよろしくお願いします。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月28日(木) 23:32
by イセミト
訂正です。

『Google先生によるとこれは「「graph_ch」という関数が定義されてねぇよ」って言われてるんだと解釈できますが、
ソースコードを見る限りちゃんと定義しているはずだし、そもそも定義されているのはDXライブラリのほうなので、』

と書きましたが、「そもそも定義されているのはDXライブラリのほうなので、」は間違いです。無視して下さい。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月28日(木) 23:46
by box
イセミト さんが書きました: Google先生によるとこれは「「graph_ch」という関数が定義されてねぇよ」って言われてるんだと解釈できますが、
違うと思います。
graph_chの中で呼んでいるDrawRotaGraphFが未解決だと言っているように見えます。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月28日(木) 23:54
by イセミト
返信ありがとうございます。

「DrawRotaGraphF」の定義はDXライブラリに置かれているはずですよね。

しかし、12章までは実行もでき、何の問題もなく表示もされていたので、やはり呼びだしに問題があるのでしょうか?

しかしそれらしい場所はやはり私には見つけられませんでした。

役立たずで申し訳ないですが助言をお願いします。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月29日(金) 00:12
by softya(ソフト屋)
DXライブラリはC++コンパイラでコンパイルする事になっていますが、C++コンパイラは同じ名前で別の型の引数をもつ関数を許容する設計となっています。
そのため、引数の型などを間違うと違う関数があると思い込みますので引数の型と数を必ず合わせてください。

正しいDrawRotaGraphFの引数。
extern int DrawRotaGraphF( float xf, float yf, double ExRate, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ; // 画像の回転描画( 座標指定が float 版 )

【追記】最後のTurnFlag は省略できます。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月29日(金) 00:15
by ISLe
DrawRotaGraphFは
int __cdecl DxLib::DrawRotaGraphF(float,float,double,double,int,int,int)
なんですよね。
とは言え、本来はdoubleからfloatへの変換の警告が出るだけでコンパイルできるはずなのですが。

そんなことはないはずですがDxLIb.hが書き換わっていたりしないですよね。
リビルドしたら通ったりしませんかね。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月29日(金) 00:17
by box
イセミト さんが書きました: エラー 1 error LNK2019: 未解決の外部シンボル "int __cdecl DxLib::DrawRotaGraphF(double,double,double,double,int,int,int)"
引数が7個あるように見えるのに対し、実際に呼び出している箇所では
イセミト さんが書きました:

コード:

	DrawRotaGraphF(
		ch.x+FIELD_X,
		ch.y+FIELD_Y,
		1.0f,
		0.0f,
		img_ch[0][ch.Image],
		true
		);
6個しかないように見えます。
このあたりは大丈夫でしょうか。

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月29日(金) 00:20
by イセミト
返信ありがとうございます。

なぜかDXはライブラリでの定義の方の引数をいつの間にやら書き換えてしまっていたことが原因のようでした!

コード:

extern	int	 DrawRotaGraphF( float xf, float yf, double ExRate, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ;

コード:

extern	int	 DrawRotaGraphF( double xf, double yf, double ExRate, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ;
と、書き換えてしまっていました。
いつ書き換えてしまったのかはさだかではありませんが、修正した後、無事実行することができました。

ありがとうございました!

Re: 13章について未定義の外部シンボルエラー

Posted: 2013年3月29日(金) 00:21
by イセミト
誤字。

「DXはライブラリ」→「DXライブラリ」

です。すみません。