注:以下文件的.depend文件相应后缀为.d,即xxx.c的.depend文件为xxx.d。
直接用gcc -MM产生的.depend文件形如:
test.o : test.c test.h
这样有个坏处,就是当 test.c 文件改变时,.depend文件仍然没变。若新的 test.c 中增加了头文件,则这个头文件并不会在依赖关系中(.dpend文件没变嘛)。所以要把.depend文件和其关联上。即变为
test.o test.d: test.c test.h
实现上面的转换用到了sed。
原理说了,下面就直接贴makefile了
ARCH=arm
ifeq ($(ARCH), arm)
CC=arm-hisiv200-linux-gcc
AR=arm-hisiv200-linux-ar
AS=arm-hisiv200-linux-as
LD=arm-hisiv200-linux-ld
CPP=arm-hisiv200-linux-g++
CP = cp
else
CC=gcc
AR=ar
AS=as
LD=ld
CPP=g++
CP=cp
endif
ifeq ($(ARCH), arm)
CC=arm-hisiv200-linux-gcc
AR=arm-hisiv200-linux-ar
AS=arm-hisiv200-linux-as
LD=arm-hisiv200-linux-ld
CPP=arm-hisiv200-linux-g++
CP = cp
else
CC=gcc
AR=ar
AS=as
LD=ld
CPP=g++
CP=cp
endif
SRC:=
OBJ:=
OBJ:=
SRC += $(wildcard ../*.c)
OBJ += $(patsubst %.c, %.o, $(notdir $(SRC)))
OBJ += $(patsubst %.c, %.o, $(notdir $(SRC)))
RULES_OBJ := $(patsubst %.c, %.d, $(filter %.c, $(SRC)))
TARGET_LIB=libvod.a
VPATH += ../
CFLAGS = -Wall -g
LDFLAGS = -lpthread
LDFLAGS = -lpthread
CPPFLAGS += -I../../../include/vod
all:$(OBJ)
$(AR) ruv $(TARGET_LIB) $(OBJ)
mv $(TARGET_LIB) ../
$(AR) ruv $(TARGET_LIB) $(OBJ)
mv $(TARGET_LIB) ../
#产生.d文件
%.d: %.c
$(CC) -MM $(CPPFLAGS) $< | sed -e 's/^\(.*\)\.o/\1\.o \1\.d/' > $@
%.o: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
clean:
-rm -f $(OBJ)
@-rm -f ../$(TARGET_LIB)
@-rm -f *~ .*swp a.out
@-rm -f *.o
@-rm -f *.s
.PHONY:clean
include $(RULES_OBJ)