Mafile通过定义规则告诉make怎么编译生成目标文件,规则的一般格式是:
目标 [目标 ...] : [依赖 ...]
[ 命令 ...]
如上所示,输出是目标,输入是依赖项。要生成输出,在命令行中,执行make 目标 [目标 ...]
。如果依赖项比目标文件更新或目标文件不存在,那么执行配置的[ 命令 ...]
输出目标,否则不执行。
方括号中的参数是可选的,省略号表示允许多个参数。所配置的每一行命令前面都必须空一个Tab
键。
示例:
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
上面例子中,目标是hello
,依赖项是main.o factorial.o hello.o
,定义了一个命令:$(CC) main.o factorial.o hello.o -o hello
,该命令根据依赖项生成目标文件。
生成目标文件,在命令行中执行:make hello
,make检查依赖项是否比目标更新,是则执行$(CC) main.o factorial.o hello.o -o hello
,否则不执行。
如果必须生成依赖项(也是某条规则的目标),则首先生成依赖项,以此类推,递归方式生成。
如果任何命令返回失败,那么make会终止执行。
在命令前加-
可忽略返回状态,无论返回什么,make都将继续执行:
clean:
-rm *.o *~ aaa
Makefile中,每执行一条命令都会把执行的命令打印出来,可以在命令前加@
关闭打印:
install:
@echo 按任何键继续...
按照Unix系统传统,有些目标已经形成惯例,基本上所有的Makefile都应该包含这些目标:
- make all – 全部编译
- make install – 把编译好的程序安装到正确位置
- make clean – 清理编译产生目标文件、中间文件等
Makefile 隐式规则
“隐式规则”是一种惯例,make按照这种“惯例”运行,不需要在Makefile里详细写明。
例如,把[xxx.c/xxx.cpp]文件编译成[xxx.o]文件这一规则就是“隐式规则”,make会自动推导出这种规则,生成[xxx.o]文件。
在下面的例子中,无需为main.o factorial.o hello.o
指定规则,make会自动根据隐式规则,把对应的cpp/c源文件编译为.o文件。
hello: main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello