ページ 11

分割コンパイルについて

Posted: 2007年3月25日(日) 21:42
by jugS
はじめまして。
C++を多少出来るようになってきたので、そろそろ画像を使ったプログラムを作りたいなと
思っている初心者です。
「BorlandC++ Compiler 5.5」「BCC Developer」を使い、
「シューティングの館」を参考に、勉強しているのですが、
下準備の6で

Error: 外部シンボル '_img_sound_load' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_initialization' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_SetColor' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_Background' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_PlayerControl' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_Background2' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_FpsTimeFanction' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)

とエラーが出てしまいます。
何度コピーペーストをし直しても、出てしまいます。
MEなのでVCが使えません。
Borlandでするにはどうしたらいいでしょうか。

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 22:03
by box
> 「BorlandC++ Compiler 5.5」「BCC Developer」を使い、

当該プロジェクトファイルをダブルクリックしてBCC Developerを起動させ、
そのプロジェクトを構成している*.cファイルや*.hファイルにはどういうものがあるか、
教えてください。

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 22:13
by jugS
ヘッダファイル
ExternGV.h GlobalVariable.h

ソースファイル
tps.cpp player.cpp background.cpp initial.cpp
img_sound_load.cpp   main.cpp
です。

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 22:22
by box
> ソースファイル
> tps.cpp player.cpp background.cpp initial.cpp
> img_sound_load.cpp   main.cpp

外部シンボル未解決エラーを出しているshot.objの元となっている
ソースファイルはどれですか?

また、プロジェクトファイルがあるフォルダの直下に、Debugフォルダがあるはずです。
Debugフォルダにあるmakefile(*.makというテキストファイル)を見せていただけますか?

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 22:29
by jugS
すいません。main.cppとshot.cppを間違えてました。
shot.makの中身は
#-------------------------------------------------------
# BCC Developer 1.2.21
# Copyright (C) 2003 jun_miura@hi-ho.ne.jp
#-------------------------------------------------------
.autodepend
CC=bcc32
RC=brc32
CFLAG=-W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG
OUTDIR=-nDebug
CINCS=
TARGET=Debug\S_shot.exe
SRC1=D:\df\S_shot\fps.cpp
OBJ1=Debug\fps.obj
SRC2=D:\df\S_shot\player.cpp
OBJ2=Debug\player.obj
SRC3=D:\df\S_shot\background.cpp
OBJ3=Debug\background.obj
SRC4=D:\df\S_shot\initial.cpp
OBJ4=Debug\initial.obj
SRC5=D:\df\S_shot\img_sound_load.cpp
OBJ5=Debug\img_sound_load.obj
SRC6=D:\df\S_shot\shot.cpp
OBJ6=Debug\shot.obj

TARGET: $(TARGET)

$(TARGET): $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(OBJ5) $(OBJ6)
$(CC) $(CFLAG) -e$(TARGET) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(OBJ5) $(OBJ6)

$(OBJ1): $(SRC1)
$(CC) $(CFLAG) $(OUTDIR) $(CINCS) -c $(SRC1)

$(OBJ2): $(SRC2)
$(CC) $(CFLAG) $(OUTDIR) $(CINCS) -c $(SRC2)

$(OBJ3): $(SRC3)
$(CC) $(CFLAG) $(OUTDIR) $(CINCS) -c $(SRC3)

$(OBJ4): $(SRC4)
$(CC) $(CFLAG) $(OUTDIR) $(CINCS) -c $(SRC4)

$(OBJ5): $(SRC5)
$(CC) $(CFLAG) $(OUTDIR) $(CINCS) -c $(SRC5)

$(OBJ6): $(SRC6)
$(CC) $(CFLAG) $(OUTDIR) $(CINCS) -c $(SRC6)

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 22:39
by box
最初の投稿での「~が未解決」というメッセージの「~」に相当する
7個の関数の実体は、どのソースファイルにありますか?
関数ごとに教えてください。

また、makefileの内容から推して考えにくいことではあるのですが、
各ソースファイルに対応する*.objのいずれかが欠けている、ということはないですか?
通常は、ないはずですが…。

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 23:05
by jugS
img_sound_load.cppにimg_sound_load

initial.cppにinitialization、SetColor

background.cppにBackground、Background2

player.cppにPlayerControl

tps.cppにFpsTimeFanction
があります。

Re:分割コンパイルについて

Posted: 2007年3月25日(日) 23:43
by box
> 各ソースファイルに対応する*.objのいずれかが欠けている、ということはないですか?
> 通常は、ないはずですが…。

こちらについてはどうでしょうか?
なぜこういうことをお聞きしているかといいますと、くだんのエラーは、
*.objや必要なライブラリ関数をリンクしてS_shot.exeを作ろうとする際、
shot.objの中で呼び出している例の7関数について、どこかの*.objに
あるはずなのに見つからない、という内容だからです。

BCC Developerで、[プロジェクト]-[再構築]を実行してみたら、どうなりますか?

Re:分割コンパイルについて

Posted: 2007年3月26日(月) 17:42
by jugS
再構築したら

Error: 外部シンボル '_img_sound_load' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_initialization' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_SetColor' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_Background' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_PlayerControl' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_Background2' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照)
Error: 外部シンボル '_FpsTimeFanction' が未解決(D:\DF\S_SHOT\DEBUG\SHOT.OBJ が参照

と出ます。

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 01:12
by jugS
連続ですいませんが、下がってきたので、投稿します。
2週間ほど、このエラーで止まっています。
何が悪いのか教えて下さい。
よろしくお願いします。

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 02:17
by Justy
 とりあえずですね、main.cppの main関数内で externしている幾つかの
関数があると思いますが、それらを全部 main関数の外に出してみて下さい。

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 12:07
by jugS
ありがとうございました。無事に実行できました。
今後の為に、なぜこうなったのか教えて頂きたいのですが。

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 14:03
by Justy
 直接的な原因はリンク時に、コンパイラが作成した各関数のマングリングされた名前が
翻訳単位毎に一致しない為、リンクすることが出来ずにエラーになっています。


□ externが WinMainの中にあった場合、
 main.obj: _CollisionDetectionを要求
 palyer.obj: @CollisionDetection$qvがある

 と名前が一致しません。


□ externが WinMainの外にあった場合、

 main.obj: @CollisionDetection$qvを要求
 palyer.obj: @CollisionDetection$qvがある

 一致するのでリンクされます。


 cppファイルなので C++として解釈され
各ソースは C++向けのマングリングを行いますが、
externを WinMainの中に書くと、その関数は C言語として認識されてしまい
C言語向けのマングリングを行ってしまうようです。

 ちなみに WinMain以外の関数で、関数内に externした場合、
普通に C++向けのマングリングが行われるようなので、問題は起こりません。


 BCCの仕様でしょうかね??

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 15:46
by jugS
とゆーことは、関数をexternするときはWinMain外にすれば、
このようなことは起きないと言うことですか?

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 15:47
by keichan
気になったので調べてみました。
---------------------------------------------
JISX3014:2003 7.5 結合指定
---------------------------------------------
参考 言語結合を持つ実体に対応する特性の中には、処理系固有のものがあり、それらは、ここでは規定しない。
   例えば、特定の言語結合が、外部結合をもつオブジェクト 又は 関数の名前を表現する特定の形式と
   関連付けられていたり、特定の呼び出し規約と関連付けられていたりすることがある。
つまり、BCCでWinMain内でextern指定を行うと、"処理系固有"の何かが柵になり、extern "C" 扱いになってしまうと。


>BCCの仕様でしょうかね??
VS2005 SP1では正常に動作確認しました。

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 15:52
by keichan
>とゆーことは、関数をexternするときはWinMain外にすれば、
>このようなことは起きないと言うことですか?

私の上記発言より
言語結合を持つ実体に対応する特性の中には、処理系固有のものがあり、それらは、ここでは規定しない。

つまり、WinMain外でextern指定しても同様の現象が起こらない。という事は保障できません。
しかし、この現象が発生するのは稀有なものであると思います。(根拠はありませんが・・・)

Re:分割コンパイルについて

Posted: 2007年3月30日(金) 16:17
by jugS
そうなんですか。
やはりプログラミングは、独学だと難しいですね。
質問に答えて頂きありがとうございました。