下面是Makefile文件的一个通用模板,包括了Release和Debug目标生成、自动依赖性计算
--------------------------------------------------------------------------------------
#Debug目标和Release目标
TARGET = libTinyXML.a
TARGET_R = libTinyXML.ra
#gcc编译和链接选项
CC = g++
ARRC = ar -ru
CFLAGS = -Wall -ggdb #-fPIC
LFLAGS = -Wl,-rpath,../bin #-shared
CFLAGS_R = -Wall -O3
LFLAGS_R = -Wl,-rpath,../bin
#源文件、目标文件、依赖文件
SRC_FILES = $(wildcard *.cpp)
OBJ_FILES = $(SRC_FILES:.cpp=.o)
OBJ_FILES_R = $(SRC_FILES:.cpp=.ro)
DEP_FILES = $(SRC_FILES:.cpp=.d)
DEP_FILES_R = $(SRC_FILES:.cpp=.rd)
#头文件目录和库文件
INCLUDE =
LIBRARY =
#Debug目标生成规则
$(TARGET) : $(DEP_FILES) $(OBJ_FILES)
#$(CC) $(CFLAGS) $(LFLAGS) -o $@ $(OBJ_FILES) $(LIBRARY)
$(ARRC) -o $@ $(OBJ_FILES) $(LIBRARY)
%.o : %.cpp
$(CC) $(CFLAGS) -c -o $@ $< $(INCLUDE)
#Release目标生成规则
$(TARGET_R) : $(DEP_FILES_R) $(OBJ_FILES_R)
#$(CC) $(CFLAGS_R) $(LFLAGS_R) -o $@ $(OBJ_FILES_R) $(LIBRARY)
$(ARRC) -o $@ $(OBJ_FILES_R) $(LIBRARY)
%.ro : %.cpp
$(CC) $(CFLAGS_R) -c -o $@ $< $(INCLUDE)
#依赖性计算
%.d : %.cpp
$(CC) -MM $< > $@
%.rd : %.cpp
$(CC) -MM $< > $@
sed -i 's/.o/.ro/' $@
all : $(TARGET) $(TARGET_R)
#伪目标,清除
.PHONY :
clean :
-rm -rf $(OBJ_FILES) $(TARGET)
-rm -rf $(OBJ_FILES_R) $(TARGET_R)
-rm -rf $(DEP_FILES) $(DEP_FILES_R)
#伪目录,打印依赖性,如果不存在,会生成
.PHONY :
depend : $(DEP_FILES) $(DEP_FILES_R)
@echo update depend files:$(DEP_FILES)
@echo update depend files:$(DEP_FILES_R)
-include $(DEP_FILES)
-include $($(DEP_FILES_R)
下面是遍历子目录,并调用子目录的Makefile
----------------------------------------------------------------------------------------------------
SUBDIR = d_a d_b d_c
all : all-recursive
all-recursive clean-recursive depend-recursive install-recursive :
@target=`echo $@ | sed s/-recursive//`; /
for subdir in '$(SUBDIR)'; do /
echo "===> Making $$target in $$subdir..."; /
(cd $$subdir && $(MAKE) $$target) /
done;
.PHONY :
clean : clean-recursive
.PHONY :
depend : depend-recursive
.PHONY :
install : install-recursive