ページ 11

分割ファイル

Posted: 2009年12月11日(金) 10:19
by layman
分割コンパイルについて
環境はVC++2008です。
ソースファイルを分割して、メインファイルと関数ファイルに分けました。
プロジェクトの新しい項目から関数のcppファイル作り、ヘッダー部分に
関数の定義を書き、ソリューションのビルトを行いました。うまくいきません(関数を認識してくれません)。
何か、VC++ではcppのファイルをリンクさせるために特別な操作がいるのでしょうか?
基本的なことですいませんがよろしくお願いします。

Re:分割ファイル

Posted: 2009年12月11日(金) 10:55
by s-rush
ソースが分からないので現地点で的確なことは言えませんが、
mainファイルで関数を定義したヘッダをインクルードしていますか?
また、ご自身で作られたヘッダファイルはどのようになっていますか?
ヘッダーは関数の宣言だけで、関数の実態を書かれている場合、
エラーが出るはずです。

VC++の場合、分割ファイルであってもビルドすれば自動的にリンクされたはずです。

もしよろしければ、ソース(プロジェクト)をアップしていただければ、
よりよい回答を得れると思いますよ^^

12/10 11:00頃修正

Re:分割ファイル

Posted: 2009年12月11日(金) 11:32
by layman
ソースファイルを確かめてみました。
プロジェクトは長いので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:分割ファイル

Posted: 2009年12月11日(金) 12:09
by s-rush
同じ名前のグローバル変数が複数回定義されていますね。

たとえば、
---------------------------------------
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:分割ファイル

Posted: 2009年12月11日(金) 12:38
by layman
そうです。そうなってます。
グローバル変数にexternを全部つけてダメだったので
できないと思っていました。
上の場合、どのようにすれば解決できますか?
ご迷惑をかけますが、よろしくお願いします。

Re:分割ファイル

Posted: 2009年12月12日(土) 00:19
by softya
ソース分割して、グローバル変数を持つ場合は、

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;



---------------------------------------
となります。