头文件:h1.h, h2.h. h3.h
c文件:c1.c, c2.c, c3.c, c4.c
dependent relation:
h1.h 依赖于h2.h和h3.h
所有c文件依赖于h1.h
makefile1:头文件改变不会引起rebuild。
OBJS := c1.o c2.o c3.o c4.o
CFLAGS+= -g -w
CC = gcc
main: $(OBJS)
$(CC) $(OBJS) $(CFLAGS) -o main
clean:
rm -f $(OBJS)
rm -f main
makefile2:每个源文件以及头文件名称写到makefile中,不够灵活且不易于维护。
OBJS := c1.o c2.o c3.o c4.o
CFLAGS+= -g -w
CC = gcc
main: $(OBJS)
$(CC) $(OBJS) $(CFLAGS) -o main
%o: h1.h h2.h h3.h
clean:
rm -f $(OBJS)
rm -f main
makefile3:灵活
CFLAGS+= -g -w
SOURCES = $(wildcard *.c)
OBJS := $(patsubst %.c, %.o,$(SOURCES))
CC = gcc
main: $(OBJS)
@echo "source files:" $(SOURCES)
@echo "object files:" $(OBJS)
$(CC) $(OBJS) $(CFLAGS) -o main
sinclude $(SOURCES:.c=.d)
%d: %c
@echo "create depend"
$(CC) -MM $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ ,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
clean:
rm -f $(OBJS)
rm -f main
rm -f *.d
输出为:
create depend
gcc -MM -g -w c4.c > c4.d.$$; \
sed 's,\(c4.\)\.o[ :]*,\1.o c4.d ,g' < c4.d.$$ > c4.d; \
rm -f c4.d.$$
create depend
gcc -MM -g -w c1.c > c1.d.$$; \
sed 's,\(c1.\)\.o[ :]*,\1.o c1.d ,g' < c1.d.$$ > c1.d; \
rm -f c1.d.$$
create depend
gcc -MM -g -w c2.c > c2.d.$$; \
sed 's,\(c2.\)\.o[ :]*,\1.o c2.d ,g' < c2.d.$$ > c2.d; \
rm -f c2.d.$$
create depend
gcc -MM -g -w c3.c > c3.d.$$; \
sed 's,\(c3.\)\.o[ :]*,\1.o c3.d ,g' < c3.d.$$ > c3.d; \
rm -f c3.d.$$
gcc -g -w -c -o c3.o c3.c
gcc -g -w -c -o c2.o c2.c
gcc -g -w -c -o c1.o c1.c
gcc -g -w -c -o c4.o c4.c
source files: c3.c c2.c c1.c c4.c
object files: c3.o c2.o c1.o c4.o
gcc c3.o c2.o c1.o c4.o -g -w -o main
real 0m0.193s
user 0m0.068s
sys 0m0.052s
此时,c1.d文件中包含生成c1.o的依赖关系:
c1.o c1.d: c1.c h1.h h2.h h3.h
注意:c1.d的文件内容中包含了c1.d
makefile4:makefile3属于标准的写法,可是个人感觉没有必要生成临时文件,再删掉文件,所以下面这个版本去掉了这两步。
CFLAGS+= -g -w
SOURCES = $(wildcard *.c)
OBJS := $(patsubst %.c, %.o,$(SOURCES))
CC = gcc
main: $(OBJS)
@echo "source files:" $(SOURCES)
@echo "object files:" $(OBJS)
$(CC) $(OBJS) $(CFLAGS) -o main
sinclude $(SOURCES:.c=.d)
%d: %c
@echo "create depend"
$(CC) -MM $(CFLAGS) $< > $@
clean:
rm -f $(OBJS)
rm -f main
rm -f *.d
输出为:输出为:
create depend
gcc -MM -g -w c4.c > c4.d
create depend
gcc -MM -g -w c1.c > c1.d
create depend
gcc -MM -g -w c2.c > c2.d
create depend
gcc -MM -g -w c3.c > c3.d
gcc -g -w -c -o c3.o c3.c
gcc -g -w -c -o c2.o c2.c
gcc -g -w -c -o c1.o c1.c
gcc -g -w -c -o c4.o c4.c
source files: c3.c c2.c c1.c c4.c
object files: c3.o c2.o c1.o c4.o
gcc c3.o c2.o c1.o c4.o -g -w -o main
real 0m0.191s
user 0m0.088s
sys 0m0.044s
c1.d文件中包含生成c1.o的依赖关系:
c1.o: c1.c h1.h h2.h h3.h
后来发现这样的写法不行,因为
当C文件或者头文件中增加了新的头文件后,d文件不会被更新,新的依赖规则不会生成。
此时生成的.d文件中没有包含.d的依赖关系:
c1.o: c1.c h1.h h2.h h3.h
这样的话,.h更新之后,.d文件得不到更新,.o的依赖关系也得不到更新。
其实不是临时文件的问题,是因为没有调用sed命令去将.o替代成为.o .d