这个Makefile为什么要创建目标文件?

问题描述 投票:0回答:1

为什么这个 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
“聪明地”知道在没有明确规则的情况下该做什么(涵盖此特定情况的答案,但也将不胜感激一般情况)。

c makefile gnu-make
1个回答
0
投票

由于

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
文件。

© www.soinside.com 2019 - 2024. All rights reserved.