自动生成的makefile命令

时间:2017-10-18 13:07:37

标签: makefile

我有3个文件:node.h,node.c和main.c 如果Makefile是

CFLAGS += -std=c99 -g -Wall
run: node
    ./node

node: node.o main.o

然后,当我运行make时,运行这些命令

cc -std=c99 -g -Wall   -c -o node.o node.c
cc -std=c99 -g -Wall   -c -o main.o main.c
cc   node.o main.o   -o node
./node

我想前两行是因为

而生成的
  • 首先,make尝试运行node,但找不到node
  • 因此,make持有run并转到下一个目标,即第4行node
  • 然后,make会看到依赖项node.omain.o。目前,它知道必须创建目标文件node.omain.o

但是,我无法理解为什么会生成第三个命令

cc   node.o main.o   -o node

为了探索这个谜,我观察到,如果第2行的node更改为node1,则会出现错误

CFLAGS += -std=c99 -g -Wall
run: node1
    ./node1

node1: node.o main.o

1 个答案:

答案 0 :(得分:1)

来自https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules

  

关联单个目标文件

     

n是通过C编译器运行链接器(通常称为ld)从n.o自动生成的。使用的精确配方是'$(CC)$(LDFLAGS)n.o $(LOADLIBES)$(LDLIBS)'。

     

对于只有一个源文件的简单程序,此规则是正确的。如果有多个目标文件(可能来自各种其他源文件),其中一个名称与可执行文件的名称相匹配,它也会做正确的事情。

当您从节点更改为node1时,不再有node1.c(因此没有隐式node1.o,因此隐式规则不适用。