具有多个依赖关系的makefile,用于单个文件

时间:2014-11-21 00:49:38

标签: linux makefile

我有一个类似于以下内容的makefile:

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

all: $(OBJS)

objs/%.o: %.c
    gcc -c $< -o $@

objs/%.o: %.cpp
    gcc -c $< -o $@

似乎有效。但我真的不明白为什么。 为什么它不尝试生成a.cpp和b.c?

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

我哪里错了?

P.S - 我使用-r -R执行我的makefile以避免内置规则

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果这些文件依赖于其他内容,Make会尝试生成a.cppb.c。但是在这种情况并非如此,这两个文件是依赖树中的叶子,因此Make没有理由尝试生成它们。