怎么写makefile?

头文件: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


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值