Makefile未编译目录中的所有C文件

Makefile未编译目录中的所有C文件,c,gcc,makefile,mingw,C,Gcc,Makefile,Mingw,我在Windows平台上与gcc和MinGW合作。我有一个包含两个*.c文件的目录: main.c和funcs.c 我正在使用以下生成文件: 当然,后面是一堆多个定义错误。从前两行可以看出,它使用相同的*.c文件,并将其编译两次为两个不同的*.o文件 我不熟悉makefile,但我认为我的$(OBJECTS)规则有问题,我很确定是$

我在Windows平台上与gcc和MinGW合作。我有一个包含两个*.c文件的目录: main.c和funcs.c

我正在使用以下生成文件:

当然,后面是一堆多个定义错误。从前两行可以看出,它使用相同的*.c文件,并将其编译两次为两个不同的*.o文件

我不熟悉makefile,但我认为我的$(OBJECTS)规则有问题,我很确定是$<导致了这个问题。我正在尝试创建一个通用的makefile,它将始终在具有相同目录结构的项目上工作,并将.c文件转换为.o文件和链接。我这样做是完全错误的还是对我的makefile有一个简单的修复

谢谢

詹姆斯这条规则:

$(OBJECTS): $(SOURCES)
    $(CC) $(INC) $(CFLAGS) $< -o $@

参见

Jeff在回答中指出了错误(所有对象都依赖于所有源:这不是c源的通用编译规则)

但是,通用规则必须具有源和对象路径。总而言之,只要替换

$(OBJECTS): $(SOURCES)
    $(CC) $(INC) $(CFLAGS) $< -o $@
$(对象):$(源)
$(CC)$(INC)$(CFLAGS)$<-o$@

$(BUILDDIR)/%.o:$(SOURCEDIR)/%.c
$(CC)$(INC)$(CFLAGS)$<-o$@
(如中所述)

请注意,这种依赖性测试不考虑包含的
.h
文件,因此它只适用于第一次构建。之后修改
.h
文件不会触发编译,因为头文件未作为依赖项列出

$(OBJECTS): $(SOURCES)
    $(CC) $(INC) $(CFLAGS) $< -o $@
funcs.o main.c: funcs.c main.c
    $(CC) $(INC) $(CFLAGS) $< -o $@
funcs.o: funcs.c main.c
    $(CC) $(INC) $(CFLAGS) $< -o $@

main.o: funcs.c main.c
    $(CC) $(INC) $(CFLAGS) $< -o $@
%.o: %.c
    $(CC) $(INC) $(CFLAGS) $< -o $@
$(OBJECTS): $(SOURCES)
    $(CC) $(INC) $(CFLAGS) $< -o $@
$(BUILDDIR)/%.o : $(SOURCEDIR)/%.c
    $(CC) $(INC) $(CFLAGS) $< -o $@