extern宣言とMakefile

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
少年X

extern宣言とMakefile

#1

投稿記事 by 少年X » 15年前

ソースファイルが長くなってきたために、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'

Poco

Re:extern宣言とMakefile

#2

投稿記事 by Poco » 15年前

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ファイルには変数の定義や関数の定義を行わないこと。

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

box

Re:extern宣言とMakefile

#3

投稿記事 by box » 15年前

>コンパイルしたのですが、エラーが出ます。

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

少年X

Re:extern宣言とMakefile

#4

投稿記事 by 少年X » 15年前

>graph.hをどこでインクルードしているのかな?
Makefileで記述しているつもりです。Makefileの最初の方で

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

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

box

Re:extern宣言とMakefile

#5

投稿記事 by box » 15年前

> >graph.hをどこでインクルードしているのかな?
> Makefileで記述しているつもりです。Makefileの最初の方で

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

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

少年X

Re:extern宣言とMakefile

#6

投稿記事 by 少年X » 15年前

解決しました

閉鎖

“C言語何でも質問掲示板” へ戻る