分割コンパイルでおこるエラーについて
Posted: 2011年12月29日(木) 12:39
C言語を学校で勉強した知識で、c++でゲームプログラミングを行なっています
(c++について知らないことも多いのでこの時点であまり良くないことをしているわけなんですが・・・クラスについても勉強していません)
RPGの戦闘システムを作り全てをメイン関数に収めて作った段階では動作するようになったので、
プログラミングの館の分割コンパイルを参考にしながら分割コンパイルをしようと思ったのですが、このやり方がうまくいきません。
~~~は既にmain.objで定義されています
とエラーが出るのです。
ネットで調べ、extern をつければよいとわかったので該当するようなところにつけてみたりしたのですが、今度は
外部シンボル ""~~~" は未解決です。
というエラーが出て、さらに幾つかの「既にmain.objで定義されています」も消えずに残ったままです。
一体どうすればいいかがわかりません。
長いプログラムを作ってから分割しようとしたため1度にでるエラーも多く、解決がしづらい状況になってしまったのは申し訳ないです。
下に、主な変数が書いてあるini.hを書きます。このini.hは分割したmain.cppとbattle.cpp両方でインクルードしています。
これを利用してコンパイルすると
1>main.cpp
main.cpp(70) : warning C4717: 'graph_main' : すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。
>main.obj : error LNK2005: "int __cdecl gpUpdateKey(void)" (?gpUpdateKey@@YAHXZ) は既に battle.obj で定義されています。
1>main.obj : error LNK2005: "struct Chara * chara" (?chara@@3PAUChara@@A) は既に battle.obj で定義されています。
1>main.obj : error LNK2005: "struct Chara * battlechara" (?battlechara@@3PAUChara@@A) は既に battle.obj で定義されています。
1>battle.obj : error LNK2001: 外部シンボル ""int * Key" (?Key@@3PAHA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int * Key" (?Key@@3PAHA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int enemycount" (?enemycount@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int enemycount" (?enemycount@@3HA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""struct Card * card" (?card@@3PAUCard@@A)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""struct Card * card" (?card@@3PAUCard@@A)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int cardorder" (?cardorder@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int cardorder" (?cardorder@@3HA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int currentenemycount" (?currentenemycount@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int currentenemycount" (?currentenemycount@@3HA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int * img" (?img@@3PAHA)" は未解決です。
1>main.obj : error LNK2019: 未解決の外部シンボル "int * img" (?img@@3PAHA) が関数 _WinMain@16 で参照されました。
1>battle.obj : error LNK2001: 外部シンボル ""int font" (?font@@3HA)" は未解決です。
(以下省略)
理解が追いついていないので長いものを貼ってしまいすいません・・・。
もし、他に記述すべき箇所があれば記述します。どうすればよいのか教えていただければありがたいです。
(c++について知らないことも多いのでこの時点であまり良くないことをしているわけなんですが・・・クラスについても勉強していません)
RPGの戦闘システムを作り全てをメイン関数に収めて作った段階では動作するようになったので、
プログラミングの館の分割コンパイルを参考にしながら分割コンパイルをしようと思ったのですが、このやり方がうまくいきません。
~~~は既にmain.objで定義されています
とエラーが出るのです。
ネットで調べ、extern をつければよいとわかったので該当するようなところにつけてみたりしたのですが、今度は
外部シンボル ""~~~" は未解決です。
というエラーが出て、さらに幾つかの「既にmain.objで定義されています」も消えずに残ったままです。
一体どうすればいいかがわかりません。
長いプログラムを作ってから分割しようとしたため1度にでるエラーも多く、解決がしづらい状況になってしまったのは申し訳ないです。
下に、主な変数が書いてあるini.hを書きます。このini.hは分割したmain.cppとbattle.cpp両方でインクルードしています。
#ifndef INI_H //二重include防止
#define INI_H
extern int Key[256]; // キーが押されているフレーム数を格納する
extern int font;//フォントを格納する変数
extern int img[100];//画像データ
extern int img_card[100];//カード画像データ
extern int img_enemy[100];//敵画像データ
extern int White;//白の格納
extern int count; //時間
extern int enemycount; //敵の数
extern int currentenemycount; //現在の敵の数
extern int cardorder; //次に引くカードが何枚目か
// キーの入力状態を更新する
extern int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
//選択肢用構造体
typedef struct{
int x,y;
char name[100];
} Menu;
//キャラ用構造体
typedef struct{
char name[100]; //モンスターの名前
int own; //キャラの種類の判定
int hp; //体力
int hp_max; //最大体力
int atk; //攻撃力
int def; //防御力
int spi; //スピード
int order; //攻撃順番
int flaglive; //生存判定フラグ 0は死んだ直後、1は生きてる、2は死後
int flagatk;//攻撃判定フラグ
int pointx;//x座標
} Chara;
extern Chara chara[100] = {
{"自分",0,300,300,300,0,100,1,1,1,0},
{"敵1",1,400,400,100,0,80,0,1,1,0},
{"敵2",2,200,400,50,0,60,0,1,1,0},
{"敵3",3,100,100,30,0,40,0,1,1,0},
};
extern Chara battlechara[100]={
{"",0,300,300,300,0,100,1,1,1,0},//自分用キャラ
{"",1,400,400,100,0,80,0,1,1,0},//敵用キャラ1
{"",2,200,400,50,0,60,0,1,1,0},//敵用キャラ2
{"",3,100,100,30,0,40,0,1,1,0},//敵用キャラ3
{"",2,500,500,20,0,20,0,1,1,0},//敵用キャラ4
};
typedef struct{
int number; //カードが並ぶ順番決める乱数
int type; //カードの種類
int atk; //カード攻撃力
int dif; //カード防御力
int exist; //カードが場に存在するかの判定
int exorder; //場に存在するカードの順番
} Card;
extern Card card[100];
#endif 1>main.cpp
main.cpp(70) : warning C4717: 'graph_main' : すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。
>main.obj : error LNK2005: "int __cdecl gpUpdateKey(void)" (?gpUpdateKey@@YAHXZ) は既に battle.obj で定義されています。
1>main.obj : error LNK2005: "struct Chara * chara" (?chara@@3PAUChara@@A) は既に battle.obj で定義されています。
1>main.obj : error LNK2005: "struct Chara * battlechara" (?battlechara@@3PAUChara@@A) は既に battle.obj で定義されています。
1>battle.obj : error LNK2001: 外部シンボル ""int * Key" (?Key@@3PAHA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int * Key" (?Key@@3PAHA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int enemycount" (?enemycount@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int enemycount" (?enemycount@@3HA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""struct Card * card" (?card@@3PAUCard@@A)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""struct Card * card" (?card@@3PAUCard@@A)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int cardorder" (?cardorder@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int cardorder" (?cardorder@@3HA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int currentenemycount" (?currentenemycount@@3HA)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""int currentenemycount" (?currentenemycount@@3HA)" は未解決です。
1>battle.obj : error LNK2001: 外部シンボル ""int * img" (?img@@3PAHA)" は未解決です。
1>main.obj : error LNK2019: 未解決の外部シンボル "int * img" (?img@@3PAHA) が関数 _WinMain@16 で参照されました。
1>battle.obj : error LNK2001: 外部シンボル ""int font" (?font@@3HA)" は未解決です。
(以下省略)
理解が追いついていないので長いものを貼ってしまいすいません・・・。
もし、他に記述すべき箇所があれば記述します。どうすればよいのか教えていただければありがたいです。