如何编写一个Makefile


Makefile是什么?

首先,我们使用make命令来自动检测程序的哪部分需要重新编译,并发出命令进行重编译。
那么make依据什么规则去检测和执行呢?这个规则就是makefile了。

一个标准的makefile如下:

target(目标)  :  prerequisites(先决条件)
	recipe(方法)

target:文件或动作
prerequisites:条件或依赖,当发生改变时执行recipe生成target,该项可为空
recipe:具体操作


Makefile的编写规则

GNU Make Manual描述了makefile的功能和编写规则,本文自然也是参考官方文档。


1. 实例

# 依赖于main.o  data.o  screen.o生成myapp执行文件
myapp : main.o  data.o  screen.o

# main.o,data.o和screen.o的编译生成条件和方法
main.o : main.c defs.h
    cc -c main.c

data.o : data.c defs.h
    cc -c data.c

screen.o : screen.c command.h
    cc -c screen.c

# clean target需要执行的操作,无依赖条件
clean :
    rm myapp main.o data.o screen.o
  • 当执行make时,defs.h和command.h一旦有变化,则所有依赖于它的target将被执行更新,因此将生成myapp执行文件。
  • 当执行make clean时,clean作为操作的target,将会执行移除 myapp main.o data.o screen.o的操作。

2. 进阶

  1. 变量
# 定义变量
objects = main.o  data.o  screen.o
#使用变量
myapp : $(objects)

clean :
    rm $(objects)
  1. 隐含规则
# implicit rule: updating a ‘.o’ file from a correspondingly named ‘.c’ file using a ‘cc -c’ command
# 银行规则:使用cc -c 命令从对应名字的.c文件来更新.o文件
main.o : defs.h
data.o : defs.h
screen.o : command.h
  1. 伪目标(Phony Target)
# 按以上的理解,正常的目标是需要生成一个文件名为clean,
# 但clean仅作为一个标签,执行特定功能,所以称为伪目标
clean :
    rm $(objects)
# 使用伪目标,运行make clean会执行删除操作,而不管是否有文件名为clean的文件
.PHONY: clean
clean:
    rm $(objects)

参考

GNU Make Manual

总结

makefile的编写规则不难掌握,难的是如何静下心来读一读文档。了解了makefile的基本组成,那么更进一步的学习还是需要阅读官方文档的,文档描述了很多的变量规则,隐含规则等等,在使用的过程中学习,makefile将会变得简单明了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值