今回の問題は「構造体のリンクエラー」です。
構造体のリンクエラーは他の方もよく躓く部分らしく、「error LNK2001:」で検索かけて調べてみるとかなりヒットします(しかもほとんどは構造体で問題を起こしてる)。
よくある間違いは記述ミス、宣言箇所がおかしい、ヘッダの扱いが間違ってて複数宣言している、等のようです。
今回の問題は、そのあたりを注意して直してみたのですが、プログラムの記述的に間違いがなさそうに思えても
の一文だけが出てリンクエラーが起きていると警告されます。1>****.obj : error LNK2001: 外部シンボル ""struct ****_t ****" (?****@@3U****_t@@A)" は未解決です。
問題のソースを以下にあげます
(おそらく問題になっているだろう部分のみを抜き出し簡素にしました。本当はよくないかもしれないですけど、エラーの再現性があるので問題はここだと思われます)
---mai.cpp
#include "DxLib.h"
#include "main.h"
#include "renda.h"
static Mouse_t Mouse;
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
Mouse.x=1;
renda();
}
DxLib_End();
return 0;
}
typedef struct {
int x;
int y;
int WheelRotVol;
unsigned int Button[8];
} Mouse_t;
extern Mouse_t Mouse;
#include "DxLib.h"
#include "main.h"
void renda(){
DrawCircle(Mouse.x,Mouse.y,10,GetColor(0,255,0),1);
}
1>コンパイルしています...
1>main.cpp
1>renda.cpp
1>コードを生成中...
1>リンクしています...
1>renda.obj : error LNK2001: 外部シンボル ""struct Mouse_t Mouse" (?Mouse@@3UMouse_t@@A)" は未解決です。
1>C:****/***/***/***.exe : fatal error LNK1120: 外部参照 1 が未解決です。
もちろん構造体の扱い方を正しく理解してるつもりはありませんし、エラーが出ている以上間違った使い方をしてるのだと思います。
しかし、これでエラーが出る理由が私にはよくわかりません。
この書き方で毎回main.hを読み込んで使えば別のファイルの関数でも構造体の型を知ることが出来て宣言部も参照できると思うのですが、構造体の扱い方として変でしょうか?
また、調べた中で以下サイト様でプログラミング環境自体がリンクエラーを出すこともあると書いてありました。
私は開発環境はVsual C++ 2008 Exprees Editionを使用しています。ソースコードやファイル名自体に誤りがなくとも、LNK2001は起こる ...(2013/6/6検索)
http://d.hatena.ne.jp/poyonon/20110614/1308044823
上記サイト様を参考にソースファイルのプロパティでソースコードとヘッダを間違っていないか確認したところとくに間違ってはないようでした。
Visual C++の使い方はよく分かっておらず、新・ゲームプログラミングの館様のサンプルプログラミングを元に開発しているので設定わまりはお手上げです。他の設定でエラーが出ているのでしょうか?
構造体は便利なものですがその性質上型を自分で宣言して扱わないといけないのでプログラミングにおけるコンパイルやリンクの基礎知識がないと間違った扱い方をしてしまうようですね。
どうぞご教授おねがいします。