复杂的makefile

时间:2014-01-28 19:48:35

标签: c makefile lex

我过去使用的大多数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

2 个答案:

答案 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”