ページ 11

ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 17:59
by はんなり
自作ゲームのプログラムが700行を超え、
ファイルを分割をしようとしたのですが上手くいきません。
LINK2005というエラーが出ているみたいです。

googleでLINK2005についてや、様々な方法を調べ、
色々な方法を試しましたがエラーが全然取れません。

分割する前のプログラムを添付します。
何も問題無ければ、画面が真っ赤になるようにしてあります。


どうすればいいのか、ご指導よろしくおねがいします。


※追記
分割はクラス単位です

Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 18:41
by maru
このタイトルだと、プログラムでファイルを分割することを考えてしまいますね。
分割コンパイルで検索すると幸せになれるでしょう。

方法はコンパイラに依存します。ソースファイルをコンパイルするときに複数のファイルを指定する方法や、
統合開発環境で指定する場合など、開発環境に依存するので、開発環境を書いてください。

Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 18:52
by はんなり
開発環境は Microsoft Visual Studio 2010 professional です

分割コンパイルで調べました。
この方法だと継承とかの関係だと思うのですが、再定義がどうのこうのでエラーが起きてしまいます。
他に方法は無いでしょうか?

Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 19:03
by maru
はんなり さんが書きました:開発環境は Microsoft Visual Studio 2010 professional です
ソリューションエクスプローラビューのソースファイルアイコンを右クリックして、[追加]-[既存の項目]を選択。
分割したソースファイルを指定します。

Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 19:06
by しひ
ヘッダで定義をするのであればextern指定子ではなくstatic指定子を使ってくださいね。
http://www.geocities.jp/ky_webid/c/032.html

ファイル分割には関係無いのですが、private指定子はご存知ですか?

Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 19:19
by はんなり
maru さんが書きました:ソリューションエクスプローラビューのソースファイルアイコンを右クリックして、[追加]-[既存の項目]を選択。
分割したソースファイルを指定します。
指示通り、入れました。ついでに.hもいれました。
しひ さんが書きました:ヘッダで定義をするのであればextern指定子ではなくstatic指定子を使ってくださいね。
http://www.geocities.jp/ky_webid/c/032.html

ファイル分割には関係無いのですが、private指定子はご存知ですか?
staticを使いましたがやっぱり無理です。エラーが消えません。
private指定子は知ってます。あんまり使いませんが・・・


ビルドの情報を上げます。見た限りだとグローバル変数が何度も定義されているようです。
class_system.hは他のヘッダーから呼び出しているからだと思います(じゃないと継承が出来ないため)

コード:

------ ビルド開始: プロジェクト: RTS_Game, 構成: Debug Win32 ------
2011/04/21 19:11:07 にビルドを開始しました。
InitializeBuildStatus:
  "Debug\RTS_Game.unsuccessfulbuild" のタッチ タスクを実行しています。
ClCompile:
  main.cpp
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(20): error C2370: 'SE_USE' : 再定義 ; 異なるストレージ クラスです。
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(20) : 'SE_USE' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(21): error C2370: 'BGM_USE' : 再定義 ; 異なるストレージ クラスです。
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(21) : 'BGM_USE' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(22): error C2370: 'Using_Class' : 再定義 ; 異なるストレージ クラスです。
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(22) : 'Using_Class' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(34): error C2011: 'System' : 'class' 型の再定義
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(34) : 'System' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_title.h(6): error C2504: 'System' : 定義されていない基本クラスが宣言されています。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(20): error C2370: 'SE_USE' : 再定義 ; 異なるストレージ クラスです。
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(20) : 'SE_USE' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(21): error C2370: 'BGM_USE' : 再定義 ; 異なるストレージ クラスです。
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(21) : 'BGM_USE' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(22): error C2370: 'Using_Class' : 再定義 ; 異なるストレージ クラスです。
          c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_system.h(22) : 'Using_Class' の宣言を確認してください。
c:\users\r.sato\documents\visual studio 2010\projects\rts_game\dxgame\class_battlemenu.h(6): error C2504: 'System' : 定義されていない基本クラスが宣言されています。

ビルドに失敗しました。

経過時間 00:00:02.41
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 20:05
by しひ
自分のところではzipファイルにあったヘッダファイル全てにインクルードガードを付けて

コード:

/*
extern int SE_USE=1;
extern int BGM_USE=0;
extern int Using_Class=0;
*/

static int SE_USE=1;
static int BGM_USE=0;
static int Using_Class=0;
で解決するので、残念ながら他の手段が分かりません。

Re: ファイル分割が上手くいきません

Posted: 2011年4月21日(木) 20:31
by はんなり
staticを付け、
#pragma once
というインクルードガードにしたら、解決できました!
どうやらインクルードガードの使い方が悪かったようです。

maruさん、しひさん
ありがとうございました!m(_ _)m