我过去使用的大多数makefile都是非常基本的,只使用一个命令,例如下面代码中的clean命令。有人可以向我解释这是如何工作的吗?究竟是什么OBJS
和$@
# compiler to use
CC = gcc
# object files needed for the project
OBJS = main.o lex.yy.o error.o
# the main target
calc: $(OBJS)
gcc -o $@ $(OBJS) -ll
# dependencies
main.o: main.c y.tab.h
error.o: error.h
lex.yy.o: lex.yy.c y.tab.h
lex.yy.c: simple-arith.l
$(LEX) simple-arith.l
clean:
$(RM) $(OBJS) lex.yy.c
这是make命令的输出:
-bash-4.1$ make
gcc -c -o main.o main.c
lex simple-arith.l
gcc -c -o lex.yy.o lex.yy.c
gcc -c -o error.o error.c
gcc -o calc main.o lex.yy.o error.o -ll
答案 0 :(得分:2)
OBJS
是一个变量。目标文件是编译器为每个编译单元输出的内容,并将被送入链接器。
calc: $(OBJS)
gcc -o $@ $(OBJS) -ll
当$(OBJS)
变量中的任何文件发生变化时,该行告诉Make重建计算。 $@
是一个特殊的Make variable,它引用了目标的名称(在本例中为calc
)。
Make的作用是构建dependency graph目标。目标位于:
之前,依赖项之后。如果需要构建任何目标(如示例中的默认calc
),它将检查所有依赖项以查看是否需要重建它们。使用修改时间来确定这个;如果目标比其中一个依赖项更旧,或者目标不存在,则需要重建。
答案 1 :(得分:2)
OBJS
只是一个变量:OBJS = main.o lex.yy.o error.o
$ @是一个自动变量。 http://www.gnu.org/software/make/manual/make.html#Automatic-Variables
$ @ 规则目标的文件名。如果目标是归档成员,则'$ @'是归档文件的名称。在一个 具有多个目标的模式规则(请参阅模式简介 规则),'$ @'是导致规则配方的任何目标的名称 要跑。
所以在这种情况下:
calc: $(OBJS)
gcc -o $@ $(OBJS) -ll
$ @是“calc”