linux - 覆盖 Makefile 中的隐式规则

标签 linux makefile

我的 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/

相关文章:

linux - 安装Docker `https://download.docker.com/linux/ubuntu focal Release 404 Not Found`时出错

linux - 如何使用sqlite命令导入大型CSV文件?

c++ - "no rule to make target"由另一个 makefile 创建的目标

c - 如何正确识别我的构建平台?

java - 错误java应用程序Android

linux - 差异工具告诉我有一个我看不到的差异

linux - 从 bash 脚本读取 makefile 变量

ubuntu - linux下安装软件的区别

linux - 如何从复杂的文件中获取字段

linux - 制作[1] : arm-linux-gcc: Command not found in ubuntu