分割コンパイルについて
環境はVC++2008です。
ソースファイルを分割して、メインファイルと関数ファイルに分けました。
プロジェクトの新しい項目から関数のcppファイル作り、ヘッダー部分に
関数の定義を書き、ソリューションのビルトを行いました。うまくいきません(関数を認識してくれません)。
何か、VC++ではcppのファイルをリンクさせるために特別な操作がいるのでしょうか?
基本的なことですいませんがよろしくお願いします。
分割ファイル
Re:分割ファイル
ソースファイルを確かめてみました。
プロジェクトは長いのでupはこれで分からなければにします。
エラー内容は次のような感じです。
error LNK20 "int bonus_sound" (?bonus_sound@@3HA) は既に Game.obj で定義されています。
error LNK2005: "int min1" (?min1@@3HA) は既に Game.obj で定義されています。
error LNK2005: "int bonusgame_logo" (?bonusgame_logo@@3HA) は既に Game.obj で定義されています。
error LNK2005ばかりです。グローバル変数をメインファイルと関数ファイルから
読んでいるのでエラーがでるのかぁ?と推測していますが分かりせん。よろしくお願いします。
プロジェクトは長いのでupはこれで分からなければにします。
エラー内容は次のような感じです。
error LNK20 "int bonus_sound" (?bonus_sound@@3HA) は既に Game.obj で定義されています。
error LNK2005: "int min1" (?min1@@3HA) は既に Game.obj で定義されています。
error LNK2005: "int bonusgame_logo" (?bonusgame_logo@@3HA) は既に Game.obj で定義されています。
error LNK2005ばかりです。グローバル変数をメインファイルと関数ファイルから
読んでいるのでエラーがでるのかぁ?と推測していますが分かりせん。よろしくお願いします。
Re:分割ファイル
同じ名前のグローバル変数が複数回定義されていますね。
たとえば、
main.cppとfunc.cppでbonus_soundやmin1がそれぞれ定義されていることになります。
つまり、同じ名前の変数が複数存在することになり、エラーが出てしまっています。
externというものを使えばエラーがとれると思います。
聞き覚えがないのであれば、一度ググッて見てください。
たくさん引っかかると思います。
また、龍神録プログラミングの第3章、5章も参考になるかと思います^^
お門違いな回答だったら申し訳ないです><;;
たとえば、
--------------------------------------- main.cpp #include "header.h" int main(){ 略 } -------------------------------------- func.cpp #include "header.h" int func(){ 略 } -------------------------------------- header.h int bonus_sound; int min1; …このような感じになっているのであれば、
main.cppとfunc.cppでbonus_soundやmin1がそれぞれ定義されていることになります。
つまり、同じ名前の変数が複数存在することになり、エラーが出てしまっています。
externというものを使えばエラーがとれると思います。
聞き覚えがないのであれば、一度ググッて見てください。
たくさん引っかかると思います。
また、龍神録プログラミングの第3章、5章も参考になるかと思います^^
お門違いな回答だったら申し訳ないです><;;
Re:分割ファイル
ソース分割して、グローバル変数を持つ場合は、
1.externを付けない実体をソース(cpp)側に用意します。実体はプログラム全体で名前毎に1個だけ存在が許されます。
※ ヘッダに実体を持つ書き方をしてしまうと、インクルードしている全てのソース側に実体が出来てしまうので今回の多重定義エラーとなります。
2.externを付けた参照だけの定義をヘッダ側に書きます。
を守ってください。
s-rushさんのコードを直すと。
---------------------------------------
main.cpp
#include "header.h"
int bonus_sound;
int min1 = 0;
int main(){
略
}
--------------------------------------
func.cpp
#include "header.h"
int func(){
略
}
--------------------------------------
header.h
extern int bonus_sound;
extern int min1;
…
---------------------------------------
となります。
1.externを付けない実体をソース(cpp)側に用意します。実体はプログラム全体で名前毎に1個だけ存在が許されます。
※ ヘッダに実体を持つ書き方をしてしまうと、インクルードしている全てのソース側に実体が出来てしまうので今回の多重定義エラーとなります。
2.externを付けた参照だけの定義をヘッダ側に書きます。
を守ってください。
s-rushさんのコードを直すと。
---------------------------------------
main.cpp
#include "header.h"
int bonus_sound;
int min1 = 0;
int main(){
略
}
--------------------------------------
func.cpp
#include "header.h"
int func(){
略
}
--------------------------------------
header.h
extern int bonus_sound;
extern int min1;
…
---------------------------------------
となります。