学会使用makefile:2

前面一篇介绍的makefile只是较为简单普通的写法,还是有很多改进的余地的。例如依赖不一定要写在一条规则中,也可以拆开写,例如:

main.o: main.h stack.h maze.h
main.o: main.c 
     gcc -c main.c

这么一来上面的例子可以该写成下面的形式:

main:main.o stack.o maze.o
    gcc main.o stack.o maze.p -o main
main.o: main.h stack.h maze.h
stack.o: stack.h main.h
maze.o: maze.h main.h
main.o: main.c
    gcc -c main.c
stack.o: stack.c
    gcc -c stack.c
maze.o: maze.c
    gcc -c stack.c
clean:
    -rm main *.o
.PHONY: clean

这样,提出去的三条规则就可以删去,写成下面的形式:

 

main: main.o stack.o maze.o
     gcc main.o stack.o maze.o -o main
main.o: main.h  stack.h maze.h
stack.o: stack.h main.h
maze.o: maze.h main.h

clean: 
    -rm main *.o
.PHONY: clean

上面这虽然删去了编译命令,但是makefile会在内建的隐式规则总查找对应规则查看隐式规则可以make -p查看。

隐式规则中:#表示注释,这和shell脚本中是一样的, = 表示赋值, $则可以用来展开一个变量,例如下面这里的隐式规则:

# default
OUTPUT_OPTION = -o $@
# default
CC = cc
# default
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
%.o: %.c
# commands to execute (built-in):
$(COMPILE.c) $(OUTPUT_OPTION) $<

这里的CC在$符号的作用下,会被展开成cc,cc 是一个符号链接,通常指向 gcc

上面的CFLAGS以及CPPFLAGS, TARGET_ARCH也都是这样的

按照上面这样展开  那么COMPILE.c展开就是cc -c,而OUTPUT_OPTION展开是 -o $@,所以按照整个式子追后展开就是:

$@和$< 是两个特殊的变量,$@ 的取值为规则中的目标, $< 的取值为规则中的第一个条件

%.o:%.c 是一种特殊的规则,称为模式规则(Pattern Rule),这里的.o .c非别就可以替换成为main.o  main.c, 那么makefile会隐式的推断出下面这条规则:

main.o : main.c
    cc -c -o main.o main.c

其他的两条也是像这样的来进行推断。
 

都是以目标为中心,一个目标依赖于若干条件,现在换个角度,以条件为中
心,Makefile还可以这么写:

cc -c -o $@ $<

前面的Makefile都是以目标为中心,一个目标依赖于若干条件,现在换个角度,以条件为中心,Makefile还可以这么写,也就是说讲会使用到条件的所有结果都列在条件的前面:

main: main.o stack.o maze.o
    gcc main.o stack.o maze.o -o main
main.o stack.o maze.o: main.h
main.o maze.o: maze.h
main.o stack.o: stack.h
clean:
    -rm main *.o
.PHONY: clean

 

 

 

 

转载于:https://my.oschina.net/u/2310741/blog/729135

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值