为什么Makefile会忽略我对.o文件的规则?

为什么Makefile会忽略我对.o文件的规则?,makefile,Makefile,注意:这似乎与……有关,但不同 简表: 为什么Makefile会忽略我对%.o文件的规则 细节: 我的Makefile包含以下规则: %.o : %.c %.h $(INCLUDES) $(CC) $(CFLAGS) $(IFLAGS) -c $(<) -o $@ 但是,我的Makefile生成了这个注释,缺少-I和-c和-o的不同顺序: gcc -O0 -Wall -g -DMU_LOG_ENABLED -c -o time_test.o time_test.c 我猜Ma

注意:这似乎与……有关,但不同

简表: 为什么Makefile会忽略我对%.o文件的规则

细节: 我的Makefile包含以下规则:

%.o : %.c %.h $(INCLUDES)
    $(CC) $(CFLAGS) $(IFLAGS) -c $(<) -o $@
但是,我的Makefile生成了这个注释,缺少-I和-c和-o的不同顺序:

gcc -O0 -Wall -g -DMU_LOG_ENABLED   -c -o time_test.o time_test.c
我猜Make使用的是内置规则,而不是我给它的规则,但我不明白为什么。我必须做什么才能使荣誉成为我的%.o规则

更多详情: 以下是Makefile的全部内容:

EXCLUDES := _template_test.c

# In this src directory, all .c files are compiled into .o files
SOURCES := $(filter-out $(EXCLUDES), $(wildcard *.c))
OBJECTS := $(patsubst %.c,%.o,$(SOURCES))
HEADERS := $(patsubst %.c,%.h,$(SOURCES))

# .h files that are not associated with a .c file, but should be copied to the
# .../include release directory.  Note that touching any of these files will
# cause a recompilation of the SOURCES.
INCLUDES :=

CC     = gcc

# Good settings for debugging
CFLAGS  = -O0 -Wall -g -DMU_LOG_ENABLED

IFLAGS = -I../ports/posix

%.o : %.c %.h $(INCLUDES)
    $(CC) $(CFLAGS) $(IFLAGS) -c $(<) -o $@

objects: $(OBJECTS)

clean:
    rm -f $(OBJECTS)

。。。这加强了我给出的规则没有被应用。

如果您编写这样的规则:

%.o : %.c %.h $(INCLUDES)
        $(CC) $(CFLAGS) $(IFLAGS) -c $(<) -o $@
仅当make可以找到或生成目标的所有先决条件时,才会应用此规则

因此,如果您想要构建foo.o,那么make必须能够找到或构建文件foo.c、foo.h以及$INCLUDES的扩展,在上面的示例中,这些文件看起来是空的

因此,在上面的示例中,这很可能意味着您的目录中没有time_test.h文件


您可以使用make-d重定向大量输出!查看make为什么决定不使用该模式规则。

如果您仅通过检查的方式使用-no-builtin rules选项调用make,会发生什么情况?叮叮!就是这样。我的单元测试源没有.h文件,只有单元测试支持文件。很高兴知道,谢谢…将标题:=$patsubst%.c、%.h、$SOURCES更改为标题:=$wildcard*.h成功了。愚蠢的5分钟编辑限制!:
$ make --no-builtin-rules objects
make: *** No rule to make target `time_test.o', needed by `objects'. Stop.
%.o : %.c %.h $(INCLUDES)
        $(CC) $(CFLAGS) $(IFLAGS) -c $(<) -o $@