因为经常要用到makefile编译,每次都为头文件的依赖关系头痛,所以这次费了两天时间开发了一个通用的makefile,它可以自动生成依赖文件,并编译,当然你要按文件里面的说明来填充一些中间文件名.
代码如下:
#自动依赖项(*.d),并编译生成文件
#编译选项
LDFLAGS = -Wall #-ggdb
#库目录
DIR = /usr/local/arm/3.3/lib
#加载库
LIBS = -lm #-L$(DIR) -llibjtts_uni.a
#编译器选择
CC = arm-linux-gcc#注意这里不能有空格,否则生成*.d时的sed替换命令出错
#目标文件名
TRG = gprs
#生成中间文件名,也是依赖文件,所以必须跟文件同名
OBJS = gprs.o atcmd.o msg.o parscmd.o CRC32.o logfile.o tfrr_pro.o telefun.o\
../include/general.o ../include/config.o ../include/io.o
SRCS = ${OBJS:%.o=%.c} #把OBJS中所有.o文件转换成.c文件
DEPE = ${OBJS:%.o=%.d} #.o ->.d
all: $(TRG)
$(TRG):$(OBJS)$(DEPE) #这里把*.d也设置依赖,这样*.d文件修改也会重编译文件
$(CC) $(OBJS) -o $(TRG) $(LIBS) $(LDFLAGS)
-include$(DEPE) #这里有2个隐晦规则:1,如果找到*.d文件执行下面的生成指令,2.找到*.d文件,则编译命令也是自动推导的
depend:$(DEPE) #自动生成依赖*.d文件
$(DEPE):%.d:%.c
-rm -f $*.d;\
gcc -MM $<|sed 's,^.*:,$*.o:,' >log.$$$$1;\
echo $(CC) $(LDFLAGS) -c -o $*.o $< >log.$$$$2;\
cat log.$$$$1 log.$$$$2|sed 's/^$(CC)/\t$(CC)/g' >$@;\
rm -f log.$$$$*;\
install: #安装到目录中
cp $(TRG) ./debug/
clean: #清除目标文件
rm -f $(OBJS) $(TRG)
clear: #清除依赖文件和目标文件
rm -f $(OBJS) $(DEPE) $(TRG)