GNU Make:强制使用我自己的规则版本

GNU Make: Force use of my own version of a rule

我的 Makefile 中有这条规则:

%: ${OBJ}/%.o ${OBJ}/AgentProgram.o ${LIB}
    $(CXX) $^ ${LDFLAGS} ${LIB_DIRS} ${LIBS} $(OUTPUT_OPTION)

如果obj/Foo.o 存在,make 将使用此规则。但是,如果该对象尚不存在,它将使用内置规则并尝试直接从我的 .cpp 进行编译。

有没有办法将此规则定义为默认规则,或关闭内置规则?

我的解决方法是修改我的 make bins 目标以首先生成所有 .o 文件。在这种情况下并不难,我改变了:

bins: ${BINS}

并将其变成这样:(我已经有可用的 ${OBJECTS})

bins: ${OBJECTS} ${BINS}

您可以 cancel pattern rules,包括内置模式规则,通过在没有配方的情况下定义它们:

%: %.c
%: %.cpp

将删除从 .c.cpp 创建二进制文件的模式规则。

或者,使用足够新的 GNU make 版本,您可以通过将此添加到您的 makefile 来禁用所有内置规则:

MAKEFLAGS += -r

-r选项的含义见手册)