我有一个类似于以下内容的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以避免内置规则
答案 0 :(得分:3)
Make不会合并不同模式规则的先决条件列表。
当Make正在寻找构建objs/a.o
的方法时,它会发现第一个模式规则与目标匹配,并且先决条件(a.c
)存在。第二个模式规则与目标匹配,但先决条件(a.cpp
)不存在且无法构建,因此Make使用第一个规则。同样,在寻找构建objs/b.o
的方法时,Make会在第一条规则上选择第二条规则。
答案 1 :(得分:2)
如果这些文件依赖于其他内容,Make会尝试生成a.cpp
和b.c
。但是在这种情况并非如此,这两个文件是依赖树中的叶子,因此Make没有理由尝试生成它们。