ページ 11

extern宣言とMakefile

Posted: 2010年1月22日(金) 22:25
by 少年X
ソースファイルが長くなってきたために、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'

Re:extern宣言とMakefile

Posted: 2010年1月22日(金) 22:47
by Poco
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ファイルには変数の定義や関数の定義を行わないこと。

これを基本的に守りましょう。

Re:extern宣言とMakefile

Posted: 2010年1月23日(土) 00:01
by box
>コンパイルしたのですが、エラーが出ます。

コンパイル時のエラーではないことは理解しているかな?
graph.hをどこでインクルードしているのかな? 画像

Re:extern宣言とMakefile

Posted: 2010年1月23日(土) 10:27
by 少年X
>graph.hをどこでインクルードしているのかな?
Makefileで記述しているつもりです。Makefileの最初の方で

Makefile内
TARGET = TestProject
OBJS = test.o
OBJS += graph.o

の部分で解決しているつもりです。

Re:extern宣言とMakefile

Posted: 2010年1月23日(土) 10:56
by box
> >graph.hをどこでインクルードしているのかな?
> Makefileで記述しているつもりです。Makefileの最初の方で

それは、前回のmake時以降にgraph.cppに対して修正があったとき、
次回のmakeでgraph.cppを間違いなくコンパイルしてgraph.oを更新する、
ということでしょう?

ソースファイルの中に
#include "graph.h"
という記述がなくて「本当に」いいんですか?
画像

Re:extern宣言とMakefile

Posted: 2010年2月04日(木) 15:40
by 少年X
解決しました