Makefile规则 target: dependency [denpency […]] command command 每一个命令的第一个字符必须是制表符,否则会出现“Missing Separator”错误并停止。 make如何知道更新?当目标的一个依赖或多个依赖体比目标体还新,make就会重新生成目标体。 伪目标 make也可以指定伪目标,如下, clean: rm app *.o 当遇到目标体clean,由于没有依赖体,所以make认为目标体是最新的,而不去执行。 但是如果碰到有个clean的文件存在呢,那就没办法执行make clean了。怎么办? make定义了个.PHONY特殊目标体。(make将不会查找是否已有目标体,而会直接执行命令) .PHONY: clean clean: rm app *.o 变量 递归展开变量 TOPDIR = /home/ubuntu/project SRCDIR = $(TOPDIR)/src 简单展开变量 CC := gcc –o CC += –O2 环境变量 make也可以读取环境变量,但是如果已有同名的变量,则外部环境变量无效。 自动变量 $@ | 规则中目标所对应的文件名(目标体) | $<<> | 规则中第一个相关文件名(依赖体) | $^ | 规则中所有文件列表,以空格为分隔符 | $? | 规则中日期新于目标的所有文件列表,以空格为分隔符 | $(@D) | 目标文件的目录部分 | $(@F) | 目标文件的文件名部分 | 预定义变量 AR | ar | AS | as | CC | cc (C编译程序) | CPP | cpp(C预处理程序) | RM | rm -f | ARFLAGS | 默认值为rv | ASFLAGS | 没有默认值 | CFLAGS | 没有默认值 | CPPFLAGS | 没有默认值 | LDFLAGS | 没有默认值 | 隐式规则 模式规则 模式规则提供了扩展隐式规则的一个办法,如下例, %.o: %.c $(CC) –c $(CFLAGS) $(CPPFLAGS) $< –o $@ 常用命令行选项 -f | 指定makefile的文件名 | -Idirname | 指定被包含的makefile所在的目录 | -n | 不执行只打印命令 | -s | 执行时不打印命令 | -d | 打印调试信息 | -w | 如果make在执行时改变目录,则打印当前目录名 | -i | 即使某个命令返回非零的退出状态值,仍继续执行 | -k | 即使某个目标编译失败,仍继续执行 | |