構造体のリンクエラー error LNK2001:

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こいくち醤油

構造体のリンクエラー error LNK2001:

#1

投稿記事 by こいくち醤油 » 7年前

構造体をグローバル変数にして扱おうとするといつも何かとエラーがでて困ってます。

今回の問題は「構造体のリンクエラー」です。
構造体のリンクエラーは他の方もよく躓く部分らしく、「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;
}
---main.h

コード:

typedef struct {
	int x;
	int y;
	int WheelRotVol;
	unsigned int Button[8];
} Mouse_t;	
extern Mouse_t Mouse;
---renda.cpp

コード:

#include "DxLib.h"
#include "main.h"

void renda(){
	DrawCircle(Mouse.x,Mouse.y,10,GetColor(0,255,0),1);
}
---renda.h

コード:

extern void renda();
---エラー出力
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を読み込んで使えば別のファイルの関数でも構造体の型を知ることが出来て宣言部も参照できると思うのですが、構造体の扱い方として変でしょうか?

また、調べた中で以下サイト様でプログラミング環境自体がリンクエラーを出すこともあると書いてありました。
ソースコードやファイル名自体に誤りがなくとも、LNK2001は起こる ...(2013/6/6検索)
http://d.hatena.ne.jp/poyonon/20110614/1308044823
私は開発環境はVsual C++ 2008 Exprees Editionを使用しています。
上記サイト様を参考にソースファイルのプロパティでソースコードとヘッダを間違っていないか確認したところとくに間違ってはないようでした。
Visual C++の使い方はよく分かっておらず、新・ゲームプログラミングの館様のサンプルプログラミングを元に開発しているので設定わまりはお手上げです。他の設定でエラーが出ているのでしょうか?



構造体は便利なものですがその性質上型を自分で宣言して扱わないといけないのでプログラミングにおけるコンパイルやリンクの基礎知識がないと間違った扱い方をしてしまうようですね。
どうぞご教授おねがいします。

アバター
みけCAT
記事: 6295
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 構造体のリンクエラー error LNK2001:

#2

投稿記事 by みけCAT » 7年前

おそらくmain.cppのMouse変数がstaticなのがいけないと思います。
ここを参考にどうぞ。
http://dixq.net/rp/5.html
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 1747
登録日時: 9年前

Re: 構造体のリンクエラー error LNK2001:

#3

投稿記事 by box » 7年前

こいくち醤油 さんが書きました: ---mai.cpp

コード:

static Mouse_t Mouse;
構造体のエラーというよりは、変数のスコープに関するエラーだと思います。
構造体だから起きるエラー「ではありません」。

他の回答者さんからの回答のとおり、変数 Mouse が static であるため、
他のソースファイルから参照できないようになっています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

こいくち醤油

Re: 構造体のリンクエラー error LNK2001:

#4

投稿記事 by こいくち醤油 » 7年前

みけCAT さんが書きました:おそらくmain.cppのMouse変数がstaticなのがいけないと思います。
ここを参考にどうぞ。
http://dixq.net/rp/5.html

お早い返信ありがとうございます。
言われたとおりstaticをはずしたところエラーは消えました。グローバル変数の挙動でリンクエラーがでてたんですかね。まあそこらへんは自分で勉強することにして、解決にします!

あとurlは凄く参考になりそうです、ありがとうございます。

こいくち醤油

Re: 構造体のリンクエラー error LNK2001:

#5

投稿記事 by こいくち醤油 » 7年前

box さんが書きました:
こいくち醤油 さんが書きました: ---mai.cpp

コード:

static Mouse_t Mouse;
構造体のエラーというよりは、変数のスコープに関するエラーだと思います。
構造体だから起きるエラー「ではありません」。

他の回答者さんからの回答のとおり、変数 Mouse が static であるため、
他のソースファイルから参照できないようになっています。
こちらもご返信ありがとうございます。

なるほど変数のスコープに関する問題ですか・・・
そこらへんも詳しくエラー出力してくれればいいのに・・・

アバター
usao
記事: 1596
登録日時: 7年前

Re: 構造体のリンクエラー error LNK2001:

#6

投稿記事 by usao » 7年前

> 1>renda.obj : error LNK2001: 外部シンボル ""struct Mouse_t Mouse" (?Mouse@@3UMouse_t@@A)" は未解決です。
> 1>C:****/***/***/***.exe : fatal error LNK1120: 外部参照 1 が未解決です。

エラー表示の中ではわかりやすい部類のものと思いますよ.

「私renda.objですけど,なんか外部に存在することになってるMouseっていう変数を参照しろってことになってるけど,見つからないんですけど…」
ということなので,問題は「変数Mouseのありかがrenda.obj(renda.cpp)からはわかんない状態にある」ことだわかります.

ISLe
記事: 2648
登録日時: 9年前
連絡を取る:

Re: 構造体のリンクエラー error LNK2001:

#7

投稿記事 by ISLe » 7年前

こいくち醤油 さんが書きました:なるほど変数のスコープに関する問題ですか・・・
そこらへんも詳しくエラー出力してくれればいいのに・・・
リンクエラーはこいくち醤油さんが書いたコードに対してだけ出力されるものではないですからね。
自分が書いた覚えのない同名の識別子が列挙されたらそれはそれで邪魔だと思いますけど。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: 構造体のリンクエラー error LNK2001:

#8

投稿記事 by へにっくす » 7年前

こいくち醤油 さんが書きました:なるほど変数のスコープに関する問題ですか・・・
そこらへんも詳しくエラー出力してくれればいいのに・・・
でももうこのパターンを経験したのですから、その詳細は要らないですよねw
対処の仕方も決まってるんだから。
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る