我的 Makefile 包含显式规则定义形式的隐式规则覆盖。但是,make 仍然调用默认的隐式规则。
这是在 RHEL 6.3、GNU Make 版本 3.81 上。
CPPFLAGS = -Wall -O2
DEPDIR = .d
DEPFLAGS = -MT "$@ $(DEPDIR)/$*.d" -MMD -MP -MF $(DEPDIR)/$*.d
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
%.o: %.cpp $(DEPDIR)/%.d
g++ -c $< $(CPPFLAGS) $(DEPFLAGS) -o $@
$(DEPDIR)/%.d: $(DEPDIR) ;
$(DEPDIR):
mkdir -p $@
include $(wildcard $(DEPDIR)/*.d)
.PHONY: clean clobber
clean:
rm -f *.o
rm -rf $(DEPDIR)
调用“make”输出:
[tlytle@tlytle-dev]$ make
g++ -Wall -O2 -c -o my_source.o my_source.cpp
为什么 make 调用 %.o 文件的默认隐式规则,而不是 Makefile 中定义的 %.o 文件的显式规则?
最佳答案
您没有覆盖从 .cpp 文件构建 .o 文件的默认规则。为了覆盖它,您需要定义一个具有相同目标先决条件的新规则;您的隐式规则有额外的先决条件,因此您只需添加一个可以构建 .o 文件的新隐式规则。
当多个规则可能匹配时选择隐式规则的规则可能会令人困惑。
最简单的事情是 delete the builtin rule以至于无法考虑。您可以通过定义与内置规则具有相同目标和先决条件的隐式规则来实现此目的,但没有配方:
%.o : %.cpp
现在 make 将别无选择,只能使用您的隐式规则。
请注意,GNU make 3.81 确实很旧。在较新版本的 GNU make 中,您可以通过将以下内容添加到 makefile 来删除所有内置规则:
MAKEFLAGS += -r
关于linux - 覆盖 Makefile 中的隐式规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57581376/