关于Makefile 2——提高篇

我们在了解了Makefile的基础原理后,为了使用更加方便,如果把全部的 .o 文件全部写下来将会很麻烦,于是我们可以利用变量代替相关的 .o 文件,于是Makefile有了提高部分:
1、利用 OBJS 替代 全部 .o 文件:
我们可以理解为 OBJS → objs → objects
于是我们将原有的Makefile
edit: main.o kbd.o command.o display.o insert.o search.o files.o utils.o
    gcc main.o kbd.o command.o display.o insert.o search.o files.o utils.o -o edit
main.o: main.c defs.h
    gcc -c main.c -o main.o
kbd.o: kbd.c defs.h command.h
    gcc -c kbd.c -o kbd.o
command.o: command.c defs.h command.h
    gcc -c command.c -o command.o
display.o: display.c defs.h buffer.h
    gcc -c display.c -o display.o
insert.o: insert.c defs.h buffer.h
    gcc -c insert.c -o insert.o
search.o: search.c defs.h buffer.h
    gcc -c search.c -o search.o
files.o: files.c defs.h buffer.h command.h
    gcc -c files.c -o files.o
utils.o: utils.c defs.h
    gcc -c utils.c -o utils.o
.PHONY: clean
clean:
    rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o

写成如下形式:
edit: main.o kbd.o command.o display.o insert.o search.o files.o utils.o
    gcc main.o kbd.o command.o display.o insert.o search.o files.o utils.o -o edit
main.o: main.c defs.h
    gcc -c main.c -o main.o
kbd.o: kbd.c defs.h command.h
    gcc -c kbd.c -o kbd.o
command.o: command.c defs.h command.h
    gcc -c command.c -o command.o
display.o: display.c defs.h buffer.h
    gcc -c display.c -o display.o
insert.o: insert.c defs.h buffer.h
    gcc -c insert.c -o insert.o
search.o: search.c defs.h buffer.h
    gcc -c search.c -o search.o
files.o: files.c defs.h buffer.h command.h
    gcc -c files.c -o files.o
utils.o: utils.c defs.h
    gcc -c utils.c -o utils.o
.PHONY: clean
clean:
    rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
感觉是不是比之前的简单了一些?不过接下来还有更加劲爆的改变
2、省略 .c 文件
现在的GNU的make很强大,他会自动推导文件以及文件依赖关系后面的命令,即我想生成一个 .o 文件,make就会在依赖文件中自动加一个 .c 文件,同时后面的命令 gcc -c *.c -o *.o 也会自动推导出来,于是程序就可以编程如下:
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit: $(objects)
    gcc $(objects) -o edit
main.o: defs.h
kbd.o: defs.h command.h
command.o: defs.h command.h
display.o: defs.h buffer.h
insert.o: defs.h buffer.h
search.o: defs.h buffer.h
files.o: defs.h buffer.h command.h
utils.o: defs.h
.PHONY: clean
clean:
    rm edit $(objects)

现在有什么感觉了?但是还不够。

3、减少.h文件
目前已经很简洁了,可是还是有那么多的 .h 文件,该如何处置呢?这时我们可以把需要相同 .h 依赖文件的目标文件写在一起,于是,就出现下面的样子:
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
edit : $(objects)
    gcc $(objects) -o edit
$(objects) : defs.h
kbd.o command.o files.o: command.h
display.o insert.o search.o files.o: buffer.h
.PHONY: clean
clean:
    rm edit $(objects)

4、关于clean

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。这是一个“修养”。一般的风格都是:

clean:
    rm edit $(objects)

更为稳健的做法是(具体原因基础篇有介绍),其中 rm 前的 - 表示如果某些文件出现问题,但不要管,继续做后面的事:
.PHONY : clean
clean :
    -rm edit $(objects)
本文内容主要引用 陈皓《跟我一起写makefile》 ,想更好的了解Makefile,推荐大家去阅读
陈皓《跟我一起写makefile》。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值