我有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.o
和main.o
。目前,它知道必须创建目标文件node.o
和main.o
但是,我无法理解为什么会生成第三个命令
cc node.o main.o -o node
为了探索这个谜,我观察到,如果第2行的node
更改为node1
,则会出现错误
CFLAGS += -std=c99 -g -Wall
run: node1
./node1
node1: node.o main.o
答案 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
,因此隐式规则不适用。