C 具有多个文件的Makefile始终构建所有内容

C 具有多个文件的Makefile始终构建所有内容,c,makefile,dependencies,gnu-make,C,Makefile,Dependencies,Gnu Make,我正在编写一个Makefile,它编译了许多C文件,其中一些文件与Makefile位于同一目录中,另一些文件位于父目录中(出于历史原因,必须存在)。我想把所有的*.o文件放在一个目录中(在我的例子中是objdir)。这似乎是可行的,但出于某种原因,这个Makefile总是构建所有内容,即使没有任何更改。我的规则/依赖性哪里出了问题 更新:我已经将我的Makefile和源代码浓缩到最低限度(源文件内容见下文)。要清楚,这是编译和链接。问题是,它在每次运行make时都会编译和链接,即使没有任何更改。

我正在编写一个Makefile,它编译了许多C文件,其中一些文件与Makefile位于同一目录中,另一些文件位于父目录中(出于历史原因,必须存在)。我想把所有的*.o文件放在一个目录中(在我的例子中是objdir)。这似乎是可行的,但出于某种原因,这个Makefile总是构建所有内容,即使没有任何更改。我的规则/依赖性哪里出了问题

更新:我已经将我的Makefile和源代码浓缩到最低限度(源文件内容见下文)。要清楚,这是编译和链接。问题是,它在每次运行make时都会编译和链接,即使没有任何更改。这不是典型的make行为

生成文件内容:

CC = gcc
CFLAGS = -g -Wall -Werror -I..
SRCS = main.c ../a.c
OBJS = $(patsubst %.c, objdir/%.o, $(SRCS))
LN_OBJS = $(patsubst %.c, objdir/%.o, $(notdir $(SRCS)))
MAIN = foo

.PHONY: clean

default: objdir $(MAIN)
    @echo  Done

$(MAIN): $(OBJS) 
    $(CC) $(CFLAGS) -o $(MAIN) $(LN_OBJS    )

objdir/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o objdir/$(notdir $@)

objdir:
    @mkdir -p objdir

clean:
    @$(RM) -rf objdir $(FDP) $(DK)
../a.c目录

#include "stdlib.h"
#include "stdio.h"

#include "a.h"

int main(int argc, char**argv)
{
    printf("Hello\n");
    a();
}
#include <stdio.h>

void a()
{
    printf("Hi from a\n");
}

您的
objdir/%.o:
规则扩展为
objdir/./a.o:../a.c
,但随后您去创建
objdir/$(notdir$@)
,违反了

解决此问题的一种方法是使用
vpath
(还要注意
objdir
应该是对象的(仅顺序)依赖项):

SRCS=main.c a.c
vpath%.c/
# [...]
objdir/%.o:%.c | objdir
$(CC)$(CFLAGS)-c$<-o$@

我无法重现您的错误。我建议您将makefile简化为一个最小的示例,并将其与您看到的输出一起发布。我已用一个简化的示例更新了问题
#ifndef __a__
#define __a__

void a();

#endif
SRCS = main.c a.c
vpath %.c ../
# [...]
objdir/%.o: %.c | objdir
    $(CC) $(CFLAGS) -c $< -o $@