以 # 开头的行是评论
.PHONY = all clean 行定义了 all 和 clean 两个伪目标。
变量 LINKERFLAG 定义了在步骤中 gcc 命令需要用到的参数。
SRCS := $(wildcard *.c):$(wildcard pattern) 是与文件名相关的一个函数。在本示例中,所有 “.c”后缀的文件会被存入 SRCS 变量。
BINS := $(SRCS:%.c=%):这被称为替代引用。本例中,如果 SRCS 的值为 'foo.c bar.c',则 BINS的值为 'foo bar'。
all: ${BINS} 行:伪目标 all 调用 ${BINS} 变量中的所有值作为子目标。
规则:
%: %.o
@echo "Checking.."
${CC} ${LINKERFLAG} $< -o $@
下面通过一个示例来理解这条规则。假定 foo 是变量 ${BINS} 中的一个值。% 会匹配到 foo(%匹配任意一个目标)。下面是规则展开后的内容:
foo: foo.o @echo "Checking.." gcc -lm foo.o -o foo
如上所示,% 被 foo 替换掉了。$< 被 foo.o 替换掉。$<用于匹配预置条件,$@ 匹配目标。对 ${BINS} 中的每个值,这条规则都会被调用一遍。
规则:
%.o: %.c
@echo "Creating object.."
${CC} -c $<
之前规则中的每个预置条件在这条规则中都会都被作为一个目标。下面是展开后的内容:
foo.o: foo.c @echo "Creating object.." gcc -c foo.c
最后,在 clean 目标中,所有的二进制文件和编译文件将被删除。
下面是重写后的 Makefile,该文件应该被放置在一个有 foo.c 文件的目录下:
# Usage: # make # compile all binary # make clean # remove ALL binaries and objects .PHONY = all clean CC = gcc # compiler to use LINKERFLAG = -lm SRCS := foo.c BINS := foo all: foo foo: foo.o @echo "Checking.." gcc -lm foo.o -o foo foo.o: foo.c @echo "Creating object.." gcc -c foo.c clean: @echo "Cleaning up..." rm -rvf foo.o foo
这些和到一起,就是makefile,当然这些功能还太少,可以加上很多别的项目。但宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对易采站长站的支持。如果你想了解更多相关内容请查看下面相关链接








