2014-11-21 73 views
2

我有类似于以下一个makefile:makefile文件有多个依赖单个文件

SRCS = a.c b.cpp 
OBJS = objs/a.o objs/b.o 

all: $(OBJS) 

objs/%.o: %.c 
    gcc -c $< -o [email protected] 

objs/%.o: %.cpp 
    gcc -c $< -o [email protected] 

看来工作。但我不明白为什么。 它为什么不尝试生成a.cpp和b.c?

当我读到它:a.cpp是objs/a.o的先决条件,它应该尝试生成它。并且因为它没有为它找到匹配的规则 - 它应该失败

我在哪里错了?

P.S - 我使用-r -R避免内建规则

回答

3

Make不组合不同模式规则的先决条件列表。

当Make正在寻找生成objs/a.o的方法时,它发现第一个模式规则与目标匹配,并且存在先决条件(a.c)。第二种模式规则与目标匹配,但先决条件(a.cpp)不存在且不能构建,因此Make使用第一个规则。同样,在寻找构建objs/b.o的方法时,Make选择第一个第二个规则。

+0

你能指导我提到它吗?我在GNU make中查找它并找不到它 – user972014 2014-11-21 09:12:10

+1

@ user972014:本手册在[模式规则](http://www.gnu.org/software/make/manual/make.html#Pattern-规则)和[它们如何匹配](http://www.gnu.org/software/make/manual/make.html#Pattern-Match)。我不知道有一个参考文件明确指出先决条件清单并未组合,但它隐含在这些章节中。 – Beta 2014-11-21 13:08:07

+0

这里。我发现它:“只有存在与文件名匹配的目标模式时,才可以使用模式规则构建给定文件,并且该规则中的所有先决条件都存在或可以构建” – user972014 2014-11-21 13:48:21

2

制作会尝试生成a.cppb.c,如果这些文件依赖于别的东西执行我的生成文件。然而,在这里并不是这样,这两个文件是依赖树中的叶子,所以Make没有理由尝试生成它们。