ページ 1 / 1
よくわからないエラーがでる
Posted: 2011年4月09日(土) 21:04
by desin
http://dixq.net/g/43.html
こちらのソースをベタ張りして、
DXライブラリをincludeし、あわよくばこれでゲームをつくろうと思ったのですが、あまり見かけないエラーがでました。
どのようなエラーで、どうすれば解決できるのでしょうか?
コード:
1>リンクしています...
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl DxLib_Init(void)" (?DxLib_Init@@YAHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl GetHitKeyStateAll(char *)" (?GetHitKeyStateAll@@YAHPAD@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl SetDrawScreen(int)" (?SetDrawScreen@@YAHH@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl ChangeWindowMode(int)" (?ChangeWindowMode@@YAHH@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl ScreenFlip(void)" (?ScreenFlip@@YAHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl ClearDrawScreen(void)" (?ClearDrawScreen@@YAHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl ProcessMessage(void)" (?ProcessMessage@@YAHXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl DxLib_End(void)" (?DxLib_End@@YAHXZ)" は未解決です。
1>C:\Documents and Settings\sood\My Documents\Visual Studio 2008\Projects\テスト\Release\テスト.exe : fatal error LNK1120: 外部参照 8 が未解決です。
また、今回使ったファイルです。
DxDirectX.h(本編からコピーしたもの)
DxLib.h(本編からコピーしたもの)
GV.h
コード:
#include "include/DxLib.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
main.cpp
コード:
#define GLOBAL_INSTANCE
#include "GV.h"
int Key[256];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
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(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//ココ!!
ScreenFlip();
}
DxLib_End();
return 0;
}
あとついででいいのですが、
http://dixq.net/rp/5.html
の#記号にはどのような意味が含まれてるのでしょうか?
どういう状態になるのでしょうか?
解説を見て、「if文の略称で、GLOBALという文字が空白やexternに入れ替わるんだな」と思うんですが・・・
コード:
#ifdef GLOBAL_INSTANCE//もし、GLOBAL_INSTANCEというマーキングがメモリ内についていたなら...
#define GLOBAL //これは、本来はこのGLOBALの後に数字や文字が入るはずなのか?
#else//(付いていなかった場合...)
#define GLOBAL extern //Globalという文字がこの後メモリに読み込んだらexternに書き換える
#endif//...ここまで実行する
GLOBAL int img;//img?・・・っていう変数なの?
Re: よくわからないエラーがでる
Posted: 2011年4月09日(土) 21:48
by bitter_fox
desin さんが書きました:http://dixq.net/g/43.html
こちらのソースをベタ張りして、
DXライブラリをincludeし、あわよくばこれでゲームをつくろうと思ったのですが、あまり見かけないエラーがでました。
どのようなエラーで、どうすれば解決できるのでしょうか?
コード:
1>リンクしています...
1>main.obj : error LNK2001: 外部シンボル ""int __cdecl DxLib_Init(void)" (?DxLib_Init@@YAHXZ)" は未解決です。
1>C:\Documents and Settings\sood\My Documents\Visual Studio 2008\Projects\テスト\Release\テスト.exe : fatal error LNK1120: 外部参照 8 が未解決です。
プロジェクトの設定はされましたでしょうか?
もしまだであれば次を参考に設定してみてください。
http://homepage2.nifty.com/natupaji/DxL ... c2008.html
このエラーはあると仮定してコンパイルに成功したものの実体がないためにリンクできなかった際に出るエラーです。ですので、ライブラリファイルが存在していないか、リンクの設定がされていないと思われます。
desin さんが書きました:
http://dixq.net/rp/5.html
の#記号にはどのような意味が含まれてるのでしょうか?
どういう状態になるのでしょうか?
解説を見て、「if文の略称で、GLOBALという文字が空白やexternに入れ替わるんだな」と思うんですが・・・
コード:
#ifdef GLOBAL_INSTANCE//もし、GLOBAL_INSTANCEというマーキングがメモリ内についていたなら...
#define GLOBAL //これは、本来はこのGLOBALの後に数字や文字が入るはずなのか?
#else//(付いていなかった場合...)
#define GLOBAL extern //Globalという文字がこの後メモリに読み込んだらexternに書き換える
#endif//...ここまで実行する
GLOBAL int img;//img?・・・っていう変数なの?
#で始まるものは主にプリプロセッサと呼ばれるものです。
http://www.geocities.jp/ky_webid/Progra ... c/024.html
また、これはプリプロセッサの応用的な使い方です。
http://cycles-of-life.dip.jp/conconcon/cpp/ore_c.html
正しく読むと、
コード:
#ifdef GLOBAL_INSTANCE // GLOBAL_INSTANCEが定義されていたら(定義というのは#defineのこと)
#define GLOBAL // GLOBALを定義(ただ定義しているだけで実質的な意味は発生しない(あとで使っているGLOBALというキーワードが存在してなければならないので))
#else // 未定義
#define GLOBAL extern // GLOBALをexternとして定義
#endif
// int img; // GLOBAL_INSTANCEが定義されてるとき(実体を定義)
// extern int img; // 定義されてないとき(外部参照)
GLOBAL int img;
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:07
by box
desin さんが書きました:
の#記号にはどのような意味が含まれてるのでしょうか?
どういう状態になるのでしょうか?
老婆心ながら、こういう基礎的なことを理解できていない状態で
ゲームプログラミングに手を出すのは時期尚早ではないかと。
まずは、C言語の文法をしっかり理解することから始めるのが先決だと思います。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:11
by desin
ご返答ありがとうございます。
#のことについて少しわかったのですが、
例えば
#define input_count 5;
と
int input_count=5;
はどう違うのでしょうか?
intではなくてもいいです。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:14
by desin
すいません、勘違いしてました。
定数に名前をつけたい時にソースコードの頭に意味を記述する目的という理解でいいのでしょうか?
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:19
by box
>#define input_count 5;
これは、変数定義ではありません。
コード中に現れる
input_count
を単純に
5;
に置き換えるだけです。input_countという変数を定義している「のではありません」。
最後にセミコロンが付いていることで、もしかしたらコンパイル中にエラーが起きることがあるかもしれません。
>int input_count=5;
これは、int型の変数input_countを定義して、初期値を5にしています。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:28
by desin
bitter_fox さんが書きました:
このエラーはあると仮定してコンパイルに成功したものの実体がないためにリンクできなかった際に出るエラーです。ですので、ライブラリファイルが存在していないか、リンクの設定がされていないと思われます。
これは、ソースコード中に引用するコードを書きこむだけではダメなのでしょうか?
コンパイラ側に設定する必要があるということですよね。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:32
by desin
box さんが書きました:>#define input_count 5;
input_count
を単純に
5;
に置き換えるだけです。input_countという変数を定義している「のではありません」。
最後にセミコロンが付いていることで、もしかしたらコンパイル中にエラーが起きることがあるかもしれません。
おお、すいません。そしてありがとうございます。
#defineというのはC言語とは関係ないところで動く置換マクロとのことでしたね。
つまり、文末までが動作範囲・・・?
空白を挟んだ3つ、4つ5つ・・・の単語が一行に記述されていたらどうなるのでしょうか?
#define count 5 6 2 3 5
みたいな感じです
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:38
by desin
ありがとうございます。
・・・が、やはり変わらず・・・
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 00:39
by box
desin さんが書きました:
#define count 5 6 2 3 5
考え方は同じです。
count
を
5スペース6スペース2スペース3スペース5
に置き換えるだけです。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 09:40
by softya(ソフト屋)
コンパイラの働きを説明したほうが良い様ですね。
[ソースコード・ファイル]
↓
プリプロセッサ #で始まるプリプロセッサ命令を処理する。 #includeでインクルード #define の置き換えなど。
↓
[中間ソースコード・ファイル]
↓
コンパイラ コンパイルして中間オブジェクトコードを作り出します。
↓
[オブジェクト・ファイル]
↓
リンカ ここで各オブジェクトがリンクされ、実行ファイルが出来ます。 ここでDXLIBをリンクします。 最初の質問で出ているエラーは、ここの段階でのエラーです。
↓
[実行ファイル(exe)]
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 10:13
by desin
>このエラーはあると仮定してコンパイルに成功したものの実体がないためにリンクできなかった際に出るエラーです。ですので、ライブラリファイルが存在していないか、リンクの設定がされていないと思われます。
つまり、プロジェクトの設定の問題ということですか・・・
それとも、「ライブラリファイルが存在していない」とは、#include "Dxlib.h"しただけでは動作してくれず
まだ他のコードが必要ということでしょうか?
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 11:00
by softya(ソフト屋)
リンクにおける設定が間違いないか確認して下さい。
「DXライブラリ置き場 使い方説明 2.VisualStudio2008 でDXライブラリを使うための設定を行う」
http://homepage2.nifty.com/natupaji/DxL ... 08.html#R2
問題と成るのはリンクに関わる⑤と⑥の部分です。
もちろん、『プロジェクトに追加すべきファイル_VC用』フォルダにDXライブラリであるDXLIB*.libファイルが存在する必要があります。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 15:03
by desin
プロジェクトに追加すべきファイルというのは、他のプロジェクトで多々使われてるincludeファイルのことですよね(中身も
ツール→オプションからなる設定に「プロジェクトに追加すべきファイル」と
プロジェクトと同じ場所にある自分がコピーして置いておいた「include」ファイルの両方を設定して試しましたが同じ結果になりました。
また、DXLIB*.libはありませんでしたがDxlib.libなら有りました。
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 15:20
by softya(ソフト屋)
>プロジェクトに追加すべきファイルというのは、他のプロジェクトで多々使われてるincludeファイルのことですよね(中身も
#includeするのはヘッダファイルでプリプロセッサの処理です。
それに対してlibはリンク時に使用します。エラーを見るかぎりはヘッダの参照は成功していて、プリプロセスとコンパイルは無事終わっているように見えます。
なのでリンクエラーだと思い回答しています。
最新のDXライブラリですが、次の様なファイルがあるか確認してみてください。
http://homepage2.nifty.com/natupaji/DxLib/dxdload.html ← 最新はこちらから。
幾つもlib拡張子のファイルがありますが全部必要です。
DxLib_VC\プロジェクトに追加すべきファイル_VC用 のディレクトリ
2011/04/10 15:13 <DIR> .
2011/04/10 15:13 <DIR> ..
2011/04/02 21:23 300,745 DxDirectX.h
2011/04/02 23:31 1,380,608 DxDrawFunc.lib
2011/04/02 22:58 279,249 DxLib.h
2011/04/02 23:37 2,615,166 DxLib.lib
2011/04/02 21:23 7,368 DxLib.txt
2011/04/02 23:34 2,701,482 DxLibW.lib
2011/04/02 23:35 2,706,798 DxLibW_d.lib
2011/04/02 23:24 2,620,798 DxLib_d.lib
2011/04/02 23:41 502,614 DxUseCLib.lib
2011/04/02 23:41 506,758 DxUseCLibW.lib
2011/04/02 23:41 507,310 DxUseCLibW_d.lib
2011/04/02 23:41 503,166 DxUseCLib_d.lib
2011/03/19 03:59 345,264 libjpeg.lib
2011/03/19 03:59 345,210 libjpeg_d.lib
2011/03/19 01:28 405,338 libpng.lib
2011/03/19 01:28 405,310 libpng_d.lib
2011/03/19 01:59 261,228 libtheora_static.lib
2011/03/19 01:59 261,206 libtheora_static_d.lib
2011/03/19 03:58 30,398 ogg_static.lib
2011/03/19 03:58 30,396 ogg_static_d.lib
2011/03/19 01:49 35,644 vorbisfile_static.lib
2011/03/19 01:49 35,644 vorbisfile_static_d.lib
2011/03/19 01:49 1,863,548 vorbis_static.lib
2011/03/19 01:49 1,863,478 vorbis_static_d.lib
2011/03/19 01:28 100,962 ZLIB.LIB
2011/03/19 01:28 100,952 zlib_d.lib
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 22:02
by desin
いつのまに更新されていたのか!と思い、既存のファイルを消して同じところに展開しました。
しかし、あいも変わらず・・・
http://www.dotup.org/uploda/www.dotup.org1517606.png
↑プロジェクトがある位置です。
includeにはプロジェクトに追加すべきファイルの中身が突っ込んであります。(名前を変えて移動しただけです)
また、ツール→オプションからなる設定です。
http://www.dotup.org/uploda/www.dotup.org1517632.png
やはり設定が違うのでしょうか?
ちなみにVC上での位置です。。
http://www.dotup.org/uploda/www.dotup.org1517655.png
Re: よくわからないエラーがでる
Posted: 2011年4月10日(日) 22:27
by softya(ソフト屋)
とりあえず私の言いたい事が伝わっていない事は分かりました。
設定で確認すべきなのは"インクルードファイル"ではなく"ライブラリ ファイル"です。
もう一度書きますので、ちゃんと確認して下さい。絶対に間違っています。
Re: よくわからないエラーがでる
Posted: 2011年4月11日(月) 00:20
by desin
一応、これが選択をライブラリにした時のキャプチャです。
http://www.dotup.org/uploda/www.dotup.org1518204.png
変にややこしいことをしてしまってすいません。設定は投稿前から変えていません。
Re: よくわからないエラーがでる
Posted: 2011年4月11日(月) 11:25
by softya(ソフト屋)
もう一度、今まで書かれたこととか添付された画像を見直してみましたが手順に書かれていない余分なことがされている気がします。
なので、もう一度次のようにやり直してみてください。
1.DXライブラリを解凍する。
2.あとの手順を簡単にするため解凍したフォルダをCドライブのROOTに移動する。
C:\DxLib_VC
3.VisualStudio2008 のメニューの『ツール』→『オプション』を選びます。
4.オプションウインドウの左側から『プロジェクトおよびソリューション』→『VC++ ディレクトリ』を選びます。
5.『ディレクトリを表示するプロジェクト』の『インクルードファイル』と『ライブラリファイル』に同じディレクトリを追加します。
C:\DxLib_VC\プロジェクトに追加すべきファイル_VC用
※ 今現在はDxLib_VC関係は違うディレクトリですよね。それは消してください。
6.VisualStudio2008 で「テスト」プロジェクトを読み込む。
7.登録してあるリソースファイルからDxDirectX.hとDxlib.hを削除。
8.テスト・プロジェクトのフォルダにあるincludeフォルダを削除。
以上でコンパイルしてみてください。
もし問題があれば確認のため今まで上げてもらった画像を最新に差し替えを御い願します。
それと、DXライブラリの導入手順にあるプログラムが正常に動くかもテストしてみてください。
http://homepage2.nifty.com/natupaji/DxL ... c2008.html
こちらが動いて、ご自分のプロジェクトだけ動かないなら設定とは別の問題です。
Re: よくわからないエラーがでる
Posted: 2011年4月11日(月) 12:29
by desin
ありがとうございます!
正常にウィンドウが表示されました!
自分がディレクトリの位置関係が把握できていなかったのが原因だと思います。
と同時に、GV.h内の
>#include "include/DxLib.h"
がいらなかったと・・
つまり、Dxlib.hのディレクトリはすでにライブラリファイル、インクルードファイルで設定してあって
"include/DxLib.h"というのは余計な物だった。(Dxlib.hで事足りる)
・・・これであっているでしょうか?
Re: よくわからないエラーがでる
Posted: 2011年4月11日(月) 13:14
by softya(ソフト屋)
desin さんが書きました:ありがとうございます!
正常にウィンドウが表示されました!
自分がディレクトリの位置関係が把握できていなかったのが原因だと思います。
と同時に、GV.h内の
>#include "include/DxLib.h"
がいらなかったと・・
つまり、Dxlib.hのディレクトリはすでにライブラリファイル、インクルードファイルで設定してあって
"include/DxLib.h"というのは余計な物だった。(Dxlib.hで事足りる)
・・・これであっているでしょうか?
そうですね。
インクルードファイルで設定済みなので
#include "DxLib.h"
だけで良いです。
リンクに失敗したのは、includeフォルダ内のDxLib.hを参照した為だと思われますが理由の説明は難しいので別の機会にさせてください。
とりあえず、DXライブラリ様のサイトの説明通りにすれば問題ありません。
Re: よくわからないエラーがでる
Posted: 2011年4月11日(月) 20:40
by desin
最後の質問への回答ありがとうございました!
解決とさせていただきます!