更改makefile中的对象文件输出路径

更改makefile中的对象文件输出路径,makefile,Makefile,我有一个makefile,它执行以下操作: FILES=file1.c file2.c file3.c subdir1/afile1.c subdir2/bfile1.c OBJS=$(FILES:.c=.o) all: $(OBJS) OBJS=$(FILES:.c=objs/.o) 这会将目标文件写入源文件所在的目录,但我不希望这样。我希望将它们写入名为“objs”、“objs/subdir1”和“objs/subdir2”的单独子目录,因此我尝试了以下方法: FILES=file1.c

我有一个
makefile
,它执行以下操作:

FILES=file1.c file2.c file3.c subdir1/afile1.c subdir2/bfile1.c
OBJS=$(FILES:.c=.o)
all: $(OBJS)
OBJS=$(FILES:.c=objs/.o)
这会将目标文件写入源文件所在的目录,但我不希望这样。我希望将它们写入名为“objs”、“objs/subdir1”和“objs/subdir2”的单独子目录,因此我尝试了以下方法:

FILES=file1.c file2.c file3.c subdir1/afile1.c subdir2/bfile1.c
OBJS=$(FILES:.c=.o)
all: $(OBJS)
OBJS=$(FILES:.c=objs/.o)
但这不起作用。我还尝试创建一个新规则,如下所示:

 %.o: %.c:
     $(CC) -o objs/$@ $(CFLAGS) $*.c
但这会导致以下错误:

 Mixed implicit and static pattern rules. Stop.

那么,将对象文件存储在反映源文件目录结构的“objs”子目录中的最简单方法是什么呢?i、 e.
file1.o
file2.o
。。。应该进入“objs”,
afile1.o
应该进入“objs/subdir1”和
bfile1.o
应该进入“objs/subdir2”?

也许不是你想要的,但是你可以使用

正如我在评论中提到的,如果你想在子目录中创建目标,你必须通过修改规则中的目标来告诉make这就是你想要的。。。仅仅修改编译器命令是不够的,因为make不知道配方在做什么

将规则写为:

OBJS = $(FILES:%.c=objs/%.o)

objs/%.o : %.c
        $(CC) -o $@ $(CFLAGS) $<
OBJS=$(文件:%.c=OBJS/%.o)
objs/%.o:%.c
$(CC)-o$@$(CFLAGS)$<

错误是因为模式规则末尾有一个额外的冒号。它应该是
%.o:%.c
而不是
%.o:%.c:
。然而,这并不能满足你的要求。