为什么这个 Makefile 能够正确/智能地从源代码生成目标文件?
.PHONY: all, clean
OBJS=lorem.o ipsum.o
all: libfoo.so
libfoo.so: $(OBJS)
$(CC) -shared -o $@ $^
clean:
rm -f $(OBJS) libfoo.so
$ make --version && make
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
cc -c -o lorem.o lorem.c
cc -c -o ipsum.o ipsum.c
cc -shared -o libfoo.so lorem.o ipsum.o
$
// lorem.c
int lorem() { return 42; }
// ipsum.c
int ipsum() { return 43; }
我没有明确编写任何规则来将源代码编译为对象——我只是创建了一个规则来从对象文件生成共享库。
我可以推测
make
中融入了一些隐含的智能规则,但我认为 make
因基本/需要针对每个依赖级别的明确规则而闻名 - 请帮助我纠正这种明显的误解,并理解如何/为什么/何时 make
“聪明地”知道在没有明确规则的情况下该做什么(涵盖此特定情况的答案,但也将不胜感激一般情况)。
由于
OBJS
是 lorem.o ipsum.o
,libfoo.so: $(OBJS)
告诉 make
,libfoo.so
取决于 lorem.o
和 ipsum.o
。所以,当make
想要制作libfoo.so
时,它想要制作lorem.o
和ipsum.o
。
如果您没有涵盖这些的显式规则,
make
会考虑其隐式规则。存在从几种已知类型的源文件创建目标文件的隐含规则。因此,如果您有匹配的源文件,make
会根据相应的源文件构建 .o
文件。