ソースファイルが長くなってきたために、extern宣言を使って分割コンパイルをしようと考えました。今までは分割しないで書いてきたのですが、限界に達しました(汗) 試しに、短いプログラムでコンパイルしたのですが、エラーが出ます。誰か助言をお願いします。ちなみにDXPです。
main.cpp内
#include <pspkernel.h>
#include "dxlibp.h"
#include "GV.h"
PSP_MODULE_INFO("DX LIB TEST", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
extern void graph_main();
void main(){
DxLib_Init();
SetDrawBlendMode(DX_BLENDMODE_ALPHA,255);
SetGraphMode(480,272,16);
while(ProcessMessage() != -1){
ClearDrawScreen();
graph_main();
ScreenFlip();
stage_count++;
}
DxLib_End();
}
GV.h内
//グローバル変数
int Key[12];//keyの設定
int stage_count;//カウンタ
int img_board[40];//ボード
int img_ch[12];//キャラクター
graph.h内
#include "dxlibp.h"
#include "function.h"
void graph_main(){
//描写内容
}
function.h内
//グローバル変数
extern int Key[12];//keyの設定
extern int stage_count;//カウンタ
extern int img_board[40];//ボード
extern int img_ch[12];//キャラクター
Makefile内
TARGET = TestProject
OBJS = test.o
OBJS += graph.o
INCDIR =
CFLAGS = -O3 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
LDFLAGS =
LIBS =
LIBS = dxlibp.a -lpspaudiolib -lpspaudio -lpspmpeg -lpspaudiocodec -lpspgu -lpng -lz -lm -lpspvalloc -lpsppower -lpsprtc -lpspgum -lpspjpeg#DXライブラリPortable使用時に追加
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Title
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
all:
@rm -f *.o
@rm -f *.elf
@rm -f *.BAK
@rm -f *.SFO
エラー内容
undefined reference to `graph_main'
extern宣言とMakefile
Re:extern宣言とMakefile
extern宣言はヘッダファイル(*.h)に、定義はソースファイル(*.cpp)にしましょう。
具体的には、
GV.hに記述されているグローバル変数の定義をGV.cpp(新規ファイル)に移動。
function.hに記述されているグローバル変数のextern宣言をGV.hに移動。
graph.hに記述されている関数graph_main()の定義をgraph.cpp(新規ファイル)に移動。
main.cppに記述されているextern void graph_main();をgraph.hに移動。
1.*.cppファイルにはextern宣言をしないこと。
2.*.hファイルには変数の定義や関数の定義を行わないこと。
これを基本的に守りましょう。
具体的には、
GV.hに記述されているグローバル変数の定義をGV.cpp(新規ファイル)に移動。
function.hに記述されているグローバル変数のextern宣言をGV.hに移動。
graph.hに記述されている関数graph_main()の定義をgraph.cpp(新規ファイル)に移動。
main.cppに記述されているextern void graph_main();をgraph.hに移動。
1.*.cppファイルにはextern宣言をしないこと。
2.*.hファイルには変数の定義や関数の定義を行わないこと。
これを基本的に守りましょう。
Re:extern宣言とMakefile
>コンパイルしたのですが、エラーが出ます。
コンパイル時のエラーではないことは理解しているかな?
graph.hをどこでインクルードしているのかな?
コンパイル時のエラーではないことは理解しているかな?
graph.hをどこでインクルードしているのかな?

Re:extern宣言とMakefile
>graph.hをどこでインクルードしているのかな?
Makefileで記述しているつもりです。Makefileの最初の方で
Makefile内
TARGET = TestProject
OBJS = test.o
OBJS += graph.o
の部分で解決しているつもりです。
Makefileで記述しているつもりです。Makefileの最初の方で
Makefile内
TARGET = TestProject
OBJS = test.o
OBJS += graph.o
の部分で解決しているつもりです。
Re:extern宣言とMakefile
> >graph.hをどこでインクルードしているのかな?
> Makefileで記述しているつもりです。Makefileの最初の方で
それは、前回のmake時以降にgraph.cppに対して修正があったとき、
次回のmakeでgraph.cppを間違いなくコンパイルしてgraph.oを更新する、
ということでしょう?
ソースファイルの中に
#include "graph.h"
という記述がなくて「本当に」いいんですか?

> Makefileで記述しているつもりです。Makefileの最初の方で
それは、前回のmake時以降にgraph.cppに対して修正があったとき、
次回のmakeでgraph.cppを間違いなくコンパイルしてgraph.oを更新する、
ということでしょう?
ソースファイルの中に
#include "graph.h"
という記述がなくて「本当に」いいんですか?
