分割コンパイルについて
分割コンパイルについて
はじめまして。
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でするにはどうしたらいいでしょうか。
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:分割コンパイルについて
> 「BorlandC++ Compiler 5.5」「BCC Developer」を使い、
当該プロジェクトファイルをダブルクリックしてBCC Developerを起動させ、
そのプロジェクトを構成している*.cファイルや*.hファイルにはどういうものがあるか、
教えてください。
当該プロジェクトファイルをダブルクリックしてBCC Developerを起動させ、
そのプロジェクトを構成している*.cファイルや*.hファイルにはどういうものがあるか、
教えてください。
Re:分割コンパイルについて
ヘッダファイル
ExternGV.h GlobalVariable.h
ソースファイル
tps.cpp player.cpp background.cpp initial.cpp
img_sound_load.cpp main.cpp
です。
ExternGV.h GlobalVariable.h
ソースファイル
tps.cpp player.cpp background.cpp initial.cpp
img_sound_load.cpp main.cpp
です。
Re:分割コンパイルについて
> ソースファイル
> tps.cpp player.cpp background.cpp initial.cpp
> img_sound_load.cpp main.cpp
外部シンボル未解決エラーを出しているshot.objの元となっている
ソースファイルはどれですか?
また、プロジェクトファイルがあるフォルダの直下に、Debugフォルダがあるはずです。
Debugフォルダにあるmakefile(*.makというテキストファイル)を見せていただけますか?
> tps.cpp player.cpp background.cpp initial.cpp
> img_sound_load.cpp main.cpp
外部シンボル未解決エラーを出しているshot.objの元となっている
ソースファイルはどれですか?
また、プロジェクトファイルがあるフォルダの直下に、Debugフォルダがあるはずです。
Debugフォルダにあるmakefile(*.makというテキストファイル)を見せていただけますか?
Re:分割コンパイルについて
すいません。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)
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:分割コンパイルについて
最初の投稿での「~が未解決」というメッセージの「~」に相当する
7個の関数の実体は、どのソースファイルにありますか?
関数ごとに教えてください。
また、makefileの内容から推して考えにくいことではあるのですが、
各ソースファイルに対応する*.objのいずれかが欠けている、ということはないですか?
通常は、ないはずですが…。
7個の関数の実体は、どのソースファイルにありますか?
関数ごとに教えてください。
また、makefileの内容から推して考えにくいことではあるのですが、
各ソースファイルに対応する*.objのいずれかが欠けている、ということはないですか?
通常は、ないはずですが…。
Re:分割コンパイルについて
img_sound_load.cppにimg_sound_load
initial.cppにinitialization、SetColor
background.cppにBackground、Background2
player.cppにPlayerControl
tps.cppにFpsTimeFanction
があります。
initial.cppにinitialization、SetColor
background.cppにBackground、Background2
player.cppにPlayerControl
tps.cppにFpsTimeFanction
があります。
Re:分割コンパイルについて
> 各ソースファイルに対応する*.objのいずれかが欠けている、ということはないですか?
> 通常は、ないはずですが…。
こちらについてはどうでしょうか?
なぜこういうことをお聞きしているかといいますと、くだんのエラーは、
*.objや必要なライブラリ関数をリンクしてS_shot.exeを作ろうとする際、
shot.objの中で呼び出している例の7関数について、どこかの*.objに
あるはずなのに見つからない、という内容だからです。
BCC Developerで、[プロジェクト]-[再構築]を実行してみたら、どうなりますか?
> 通常は、ないはずですが…。
こちらについてはどうでしょうか?
なぜこういうことをお聞きしているかといいますと、くだんのエラーは、
*.objや必要なライブラリ関数をリンクしてS_shot.exeを作ろうとする際、
shot.objの中で呼び出している例の7関数について、どこかの*.objに
あるはずなのに見つからない、という内容だからです。
BCC Developerで、[プロジェクト]-[再構築]を実行してみたら、どうなりますか?
Re:分割コンパイルについて
再構築したら
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 が参照
と出ます。
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:分割コンパイルについて
とりあえずですね、main.cppの main関数内で externしている幾つかの
関数があると思いますが、それらを全部 main関数の外に出してみて下さい。
関数があると思いますが、それらを全部 main関数の外に出してみて下さい。
Re:分割コンパイルについて
直接的な原因はリンク時に、コンパイラが作成した各関数のマングリングされた名前が
翻訳単位毎に一致しない為、リンクすることが出来ずにエラーになっています。
□ 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の仕様でしょうかね??
翻訳単位毎に一致しない為、リンクすることが出来ずにエラーになっています。
□ 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:分割コンパイルについて
気になったので調べてみました。
>BCCの仕様でしょうかね??
VS2005 SP1では正常に動作確認しました。
--------------------------------------------- JISX3014:2003 7.5 結合指定 --------------------------------------------- 参考 言語結合を持つ実体に対応する特性の中には、処理系固有のものがあり、それらは、ここでは規定しない。 例えば、特定の言語結合が、外部結合をもつオブジェクト 又は 関数の名前を表現する特定の形式と 関連付けられていたり、特定の呼び出し規約と関連付けられていたりすることがある。つまり、BCCでWinMain内でextern指定を行うと、"処理系固有"の何かが柵になり、extern "C" 扱いになってしまうと。
>BCCの仕様でしょうかね??
VS2005 SP1では正常に動作確認しました。
Re:分割コンパイルについて
>とゆーことは、関数をexternするときはWinMain外にすれば、
>このようなことは起きないと言うことですか?
私の上記発言より
言語結合を持つ実体に対応する特性の中には、処理系固有のものがあり、それらは、ここでは規定しない。
つまり、WinMain外でextern指定しても同様の現象が起こらない。という事は保障できません。
しかし、この現象が発生するのは稀有なものであると思います。(根拠はありませんが・・・)
>このようなことは起きないと言うことですか?
私の上記発言より
言語結合を持つ実体に対応する特性の中には、処理系固有のものがあり、それらは、ここでは規定しない。
つまり、WinMain外でextern指定しても同様の現象が起こらない。という事は保障できません。
しかし、この現象が発生するのは稀有なものであると思います。(根拠はありませんが・・・)