ページ 11

「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 15:26
by you3749
「14歳からはじめるC言語ゲームプログラミング教室VisualStudio2008編」に沿って組んでいます。
今、第3章 P129のプログラムを走らせて、キャラクターが停止時、ジャンプ時、走行時で画像を変えるものを組むところで詰まっています。
本に書かれているとおりに打ち込んでも「外部参照1が未解決です。」と出力ウィンドウに出てしまい、
その後、「ビルドエラーが発生しました。最後に成功したビルドを実行しますか?」と出て、それをはいと答えると
今度は「指定したファイルが見つかりません。」と出ます。
このページの直前の重力を反映させたものは本のとおりに走ったのですが、ココだけ上手くいきません。
同じような事例はあるようですが、イマイチ要領を得ません。
WIN32プロジェクトでもう一度走らせても同様の反応でした。
ご助言ください。
mymain.cppのソースは以下です。

コード:

#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40,400};
Vector g_jikivector = {0,0};
BOOL g_direction = DIRECTION_RIGHT;
BOOL g_nowjumping = FALSE;
//画像ハンドル
int g_jikiimage[11];
//メインループ
void MyMain(){
	Vector curvec1 = {0,0};
	int key = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
	if( key & PAD_INPUT_LEFT){
		curvec1 = AddVector(curvec1,LEFTMOVEC);
		g_direction = DIRECTION_LEFT;
	}
	if( key & PAD_INPUT_RIGHT){
		curvec1 = AddVector(curvec1,RIGHTMOVEC);
		g_direction = DIRECTION_RIGHT;
	}
	//地面との当たり判定
	BOOL ontheground = FALSE;//着地フラグ
	if(g_jikipos.y > 399){
		ontheground = TRUE;
		g_nowjumping = FALSE;
		g_jikivector.x = 0;
		g_jikivector.y = 0;
	}
	//ジャンプ処理
	if( key & PAD_INPUT_A){
		curvec1 = AddVector(curvec1,JUMPMOVEC);
		g_nowjumping = TRUE;
	}

	//自キャラ座標の計算
	if( ontheground == TRUE){
		//接地時
		g_jikivector = AddVector( g_jikivector,curvec1);
	}else{
		//ジャンプ中
		g_jikivector = AddVector( g_jikivector,GRAVITY);
		if(g_jikivector.y > 400) g_jikivector.y = 400;
	}
	g_jikipos = AddVectorInFrameTime(g_jikipos,g_jikivector);
	//自キャラの描画
	if( (ontheground == TRUE) && (g_nowjumping == FALSE)){
		if(fabs(curvec1.x) > ZEROVALUE ){
			//走る
			DrawAnimation( g_jikipos.x, g_jikipos.y,1,0, g_direction , &g_jikiimage[2] , 6,12);
		}else{
			//停止状態
			DrawAnimation( g_jikipos.x, g_jikipos.y,1,0, g_direction ,&g_jikiimage[0],1,12);
		}
	}else{
		//ジャンプ状態
		if( fabs(g_jikivector.x) < ZEROVALUE ){
			DrawAnimation( g_jikipos.x, g_jikipos.y,1,0, g_direction ,&g_jikiimage[8] , 1 ,12);
		}else{
			DrawAnimation( g_jikipos.x, g_jikipos.y,1,0, g_direction ,&g_jikiimage[9] , 1,12);
		}
	}
}
件の出力ウィンドウの内容が以下です。
1>------ ビルド開始: プロジェクト: chap4, 構成: Debug Win32 ------
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "int __cdecl LoadFiles(void)" (?LoadFiles@@YAHXZ) が関数 _WinMain@16 で参照されました。
1>C:\Users\user\Documents\Visual Studio 2010\Projects\chap4\Debug\chap4.exe : fatal error LNK1120: 外部参照 1 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

Re: 「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 15:39
by nil
LoadFile関数が定義されていませんというエラーです。
LoadFile関数の中身を書いてください。

Re: 「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 15:45
by softya(ソフト屋)
codeタグを使ってくださいね。今回は私が直しておきました。
http://dixq.net/board/board.html#k10

それと「14歳からはじめるC言語ゲームプログラミング教室VisualStudio2008編」はあくまでゲームプログラミングの入門書なので、C言語自体のプログラミングの入門書としては情報が圧倒的に足りません。
C言語の入門サイトと並行で勉強されることをおすすめします。
「苦しんで覚えるC言語」
http://9cguide.appspot.com/
出来れば、サイトよりも情報間違いの少ない「やさしいC」など書籍をおすすめします。

今回のエラーの解説。
>myhelper.obj : error LNK2019: 未解決の外部シンボル "int __cdecl LoadFiles(void)" (?LoadFiles@@YAHXZ) が関数 _WinMain@16 で参照されました。
>C:\Users\user\Documents\Visual Studio 2010\Projects\chap4\Debug\chap4.exe : fatal error LNK1120: 外部参照 1 が未解決です。

LoadFilesと言う関数の呼び出しがWinMainでありましたが、リンク時にLoadFiles関数が見つかりませんでした。
リンクが未解決なのでエラーです。

Re: 「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 16:29
by MoNoQLoREATOR
本の通りにやって駄目だということは本が間違っている可能性があります。
特にそのシリーズは誤植が多い事で有名ですから、本が間違っている可能性は高いと思われます。
公式ホームページに正誤表が載っていたりするので調べてみると良いでしょう。

それと、ソースコードの見本が付属しているか、公式ホームページからダウンロードできるようになっていると思いますので、それと見比べて違う所を探したり、そのソースコードをコンパイルしてみたりすると原因や解決法がわかるかもしれません。
もっとも、見本のソースコードがまちがっていたらどうしようもありませんが。

それでも解決できなかったら、とりあえずmyhelper.hとmymain.hの中身も晒しましょう。

Re: 「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 16:32
by box
you3749 さんが書きました: mymain.cppのソースは以下です。
エラーメッセージによると、
you3749 さんが書きました: 1>myhelper.obj : error LNK2019: 未解決の外部シンボル "int __cdecl LoadFiles(void)" (?LoadFiles@@YAHXZ) が関数 _WinMain@16 で参照されました。
myhelper.obj の中でエラーが出ていますので、ソースコードを載せるのであれば、
mymain.cpp ではなく myhelper.cpp の方がよかったと思います。

Re: 「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 16:36
by softya(ソフト屋)
著者であるリブロワークスさんの作りからするとmyhelper.cpp は半ライブラリとして提供されているもので、mymainの方が機能を書くために使われる作りになっていると推測されます。
なので、myhelper.cpp 公開はリブロワークスさんの著作権的にマズイものと思われます。
LoadFilesをmymainに書くのが正しいんじゃないかと。

Re: 「外部参照1が未解決です。」と出てしまう。

Posted: 2012年8月20日(月) 23:16
by you3749
皆さんのご回答のとおりに公式サイトの手本プログラムと比較してみると、
mymain.cpp(タグを付けていただいたソース)の一番後ろに

コード:

int LoadFiles(){
	//画像ファイルの読み込み
	if (LoadDivGraph("media\\player01.bmp",
		11,11,1,64,64,g_jikiimage) == -1) return -1;

	return 1;
}
が入っていました。
確かに定義してもいない"LoadFiles"が使えるわけがありませんでした。
softyaさんのご回答がズバリ的中していました。
皆さんご回答ありがとうございました。

ps
softyaさん
教本を教えていただきありがとうございます。