外部参照が未解決のエラーで困っています

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

外部参照が未解決のエラーで困っています

#1

投稿記事 by beep » 14年前

現在DXライブラリを使ってローグライクゲームを作成しています。
龍神録と同じ方法で変数を定義しているのですが、
int whiteのみ外部参照できずに困っています。

<global.h>

コード:

#include "define.h"
#include "../../include/DxLib.h"
#include <cstdlib>
#include <vector>
#include <iostream>
#include <ctime>
#include <string>

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

#include "function.h"           //関数宣言

//キャラクタデータ宣言
GLOBAL ch_t ch;

//フロアデータ
GLOBAL floor_t floor;

GLOBAL int func_state;


//画像データ
GLOBAL int img_ch[8][6];
GLOBAL int img_board[40]; 
GLOBAL int img_map[14];
GLOBAL int img_mapping_tip[3];
GLOBAL int img_spot;
GLOBAL int img_shadow[9];
GLOBAL int img_step;
GLOBAL int img_message[9];


//メッセージ関連
GLOBAL int type;
GLOBAL int white;
GLOBAL std::string message1_s;
GLOBAL std::string message2_s;


//動的変数
GLOBAL std::vector<rect_t> rect_list;
GLOBAL std::vector<room_t> room_list;
GLOBAL std::vector<couple_t> couple_list;
GLOBAL std::vector<rect_t>::iterator ite_rect;

GLOBAL configpad_t configpad;
<ini.cpp>

コード:

#include "../include/global.h"
void first_ini(){
	ch.x = 192;
	ch.y = 192;

	floor.floor_level = 0;

	configpad.down = 0;
	configpad.left = 1;
	configpad.right = 2;
	configpad.up = 3;
	configpad.LSHIFT = 4;
	configpad.X = 5;
	configpad.C = 6;

	type = 0;
	white = GetColor( 255 , 255 , 255 );
	SRand((unsigned)time( NULL ));
}
<エラーメッセージ>
ini.obj : error LNK2001: 外部シンボル ""int white" (?white@@3HA)" は未解決です。
C:\Documents and Settings\r\デスクトップ\ローグライク\Debug\ローグライク.exe : fatal error LNK1120: 外部参照 1 が未解決です。

int typeと同じ方法で宣言、使用しているのにもかかわらず、int whiteだけエラーが出ます。
GLOBAL std::string message1_s、GLOBAL std::string message2_sでも同じ症状で困っています。

返答よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 外部参照が未解決のエラーで困っています

#2

投稿記事 by softya(ソフト屋) » 14年前

見た目には変なところが無いのでソリューションエクスプローラにglobal.hが登録されていないのでリコンパイルされていないのでは?と疑いたくなります。
もし無かったら登録してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beep

Re: 外部参照が未解決のエラーで困っています

#3

投稿記事 by beep » 14年前

ソリューションエクスプローラーには登録されていました。
一度global.h削除して、もう一度作成し内容をコピーしてみましたがだめでした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 外部参照が未解決のエラーで困っています

#4

投稿記事 by softya(ソフト屋) » 14年前

beep さんが書きました:ソリューションエクスプローラーには登録されていました。
一度global.h削除して、もう一度作成し内容をコピーしてみましたがだめでした。
VC++でしたら、ini.cppのwhiteを選んで右クリックで「全ての参照を検索を」行なってみて下さい。
どこかに別のwhiteがある気がします。あるいは別のヘッダとか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beep

Re: 外部参照が未解決のエラーで困っています

#5

投稿記事 by beep » 14年前

検索を実行しましたが、ほかにwhiteファイルはありませんでした。
これからglobal変数を追加してみて、正常に動作するか試してみます。

beep

Re: 外部参照が未解決のエラーで困っています

#6

投稿記事 by beep » 14年前

int img_enemy[8][4];を他の画像データと同じ方法で宣言、使用してみましたが
error LNK2001: 外部シンボル ""int (* img_enemy)[4]" (?img_enemy@@3PAY03HA)" は未解決です。
が出ました。

<global.h>

コード:

 #include "define.h"
#include "../../include/DxLib.h"
#include <cstdlib>
#include <vector>
#include <iostream>
#include <ctime>
#include <string>
 
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif
 
#include "function.h"           //関数宣言
 
//キャラクタデータ宣言
GLOBAL ch_t ch;
 
//フロアデータ
GLOBAL floor_t floor;
 
GLOBAL int func_state;
 
 
//画像データ
GLOBAL int img_ch[8][6];
GLOBAL int img_board[40]; 
GLOBAL int img_map[14];
GLOBAL int img_mapping_tip[3];
GLOBAL int img_spot;
GLOBAL int img_shadow[9];
GLOBAL int img_step;
GLOBAL int img_message[9];
GLOBAL int img_enemy[8][4];
 
 
//メッセージ関連
GLOBAL int type;
GLOBAL int white;
GLOBAL std::string message1_s;
GLOBAL std::string message2_s;
 
 
//動的変数
GLOBAL std::vector<rect_t> rect_list;
GLOBAL std::vector<room_t> room_list;
GLOBAL std::vector<couple_t> couple_list;
GLOBAL std::vector<rect_t>::iterator ite_rect;
 
GLOBAL configpad_t configpad; 

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 外部参照が未解決のエラーで困っています

#7

投稿記事 by beatle » 14年前

一応確認しておきますが、GLOBAL_INSTANCEを#defineしてからglobal.hを#includeしていますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 外部参照が未解決のエラーで困っています

#8

投稿記事 by softya(ソフト屋) » 14年前

GLOBAL_INSTANCEがdefineしてあるのはmain.cppでしょうか?
global.hを直してもmain.cppがコンパイルされていないと(出力ウィンドウに表示されます)このエラーになります。
global.hを変更してみてビルドでmain.cppがコンパイルされることを確認してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beep

Re: 外部参照が未解決のエラーで困っています

#9

投稿記事 by beep » 14年前

解決しました。
main関数で#define GLOBAL_INSTANCEとしたはずが#define GLOBAL_INSTANCになっていました。
softyaさん、beatleさん、どうもありがとうございました。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 外部参照が未解決のエラーで困っています

#10

投稿記事 by beatle » 14年前

解決して良かったですね。

ちなみにですが、
beep さんが書きました:int typeと同じ方法で宣言、使用しているのにもかかわらず、int whiteだけエラーが出ます。
というように、なぜtypeもwhiteも同じように宣言しているのにwhiteだけ「未解決」になってしまうのか、ということですが、それには理由があります。
他の.cppファイルからwhiteしか参照されていないからです。

コンパイラ(正確にはリンカですが)は、.cppファイルの中から使われている変数のみ、実体の定義を必要としますので、どの.cppファイルからも利用されていない変数は、実体の定義がなくても「未解決」エラーにはならないのです。

閉鎖

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