參考了一個多目錄下的Makefile的編寫,但是有幾處錯誤沒法測試,這裏作了改正,寫了一模板,用了三個文件file1.h,file2.h,file3.h,test.c作測試。
1. 目錄結構maketest下的子目錄
bin:存放生成的文件
include:存放頭文件(這裏放入file1.h,file2.h,file3.h)
libs:存放引用的庫
src:存放源文件(這裏放入file1.c,file2.c,file3.c,test.c)
其中的Makefile文件如下
TOPDIR :=$(shell if [ "$$PWD" != "" ];then echo $$PWD;else pwd;fi)
export TOPDIR
LIBPATH:= $(TOPDIR)/libs
export LIBPATH
SUBDIRS =src
CPLUS_INCLUDE_PATH = $CPLUS_INCLUDE_PATH:$(TOPDIR)/include
export CPLUS_INCLUDE_PATH
.PHONY:$(SUBDIRS)
all:depend$(SUBDIRS)
dependdep:
@for dir in $(SUBDIRS);do $(MAKE) -C $$dir.depend;done
$(SUBDIRS):
$(MAKE) -C $@ all
clean:
@for dir in $(SUBDIRS);do $(MAKE) -C $$dirclean;done
2. src目錄下的Makefile如下
SUBDIRS =ebook
.PHONY:$(SUBDIRS) clean
all:.depend$(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@ all
.dependdep:
@for dir in $(SUBDIRS);do $(MAKE) -C $$dir.depend;done
clean:
@for dir in $(SUBDIRS);do $(MAKE) -C $$dirclean;done
3. ebook目錄下的Makefile文件如下
INCLUDEDIRS+= -I/usr/include -I$(TOPDIR)/include
CC = gcc
CFLAGS = -O4 $(INCLUDEDIRS)
ELF = ../../bin/ebook #相對於可執行文件
AOBJS = $(patsubst %.s, %.o, $(wildcard *.s))
COBJS = $(patsubst %.c, %.o, $(wildcard *.c))
CPPOBJS =$(patsubst %.cpp, %.o, $(wildcard *.cpp))
OBJS = $(AOBJS) $(COBJS) $(CPPOBJS)
all:.depend $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -L $(LIBPATH) \
-L /usr/lib -ljpeg -lfreetype -lttf -lpthread \
-L /usr/X11R6/lib \
-o $(ELF)
chmod 755 $(ELF)
.depend:Makefile $(AOBJS:.o=.S) $(COBJS:.o=.c) $(CPPOBJS:.o=.cpp)
$(CC) -M $(CFLAGS) $(AOBJS:.o=.S)$(COBJS:.o=.c) $(CPPOBJS:.o=.cpp) > $@
sinclude.depend
clean:
rm -f *.o .depend *.out *.bak
rm-f $(ELF)