Makefile 每个编译器选项组合的对象文件目录

Makefile 每个编译器选项组合的对象文件目录,makefile,gnu-make,Makefile,Gnu Make,我正在阅读gnu make第10.5.4节“模式如何匹配”,但听起来我不能做我想做的事情 我想设置一个目录结构,其中我的源代码位于一个目录中,并且有子目录来保存对象文件。 每个生成配置一个子目录。 所以我可能有这些文件 a.c debug/a.o # compiled with -g release/a.o # compiled with -O 所以我想制定这样的规则 debug/%.o : %.c gcc -c -g %.c -o $@ release/%.o : %.c

我正在阅读gnu make第10.5.4节“模式如何匹配”,但听起来我不能做我想做的事情

我想设置一个目录结构,其中我的源代码位于一个目录中,并且有子目录来保存对象文件。 每个生成配置一个子目录。 所以我可能有这些文件

a.c
debug/a.o # compiled with -g
release/a.o # compiled with -O
所以我想制定这样的规则

debug/%.o : %.c
    gcc -c -g %.c -o $@

release/%.o : %.c
    gcc -c -O %.c -o $@
但是第10.5.4节告诉我,“debug/a.o”上的匹配将使stem成为“debug/a”,因此gnu将生成 将在“debug/a.c”中查找源文件,这不是我想要的


有没有办法让GNU make帮助我?

您的make文件将按编写的方式工作

发件人:

当目标图案不包含斜杠时(通常是这样 不),文件名中的目录名将从文件名中删除 在与目标前缀和后缀进行比较之前。之后 将文件名与目标模式(目录)进行比较 名称及其结尾的斜杠将添加到 从模式规则的先决条件生成的先决条件文件名 模式。。。[加粗]

您的目标模式确实包含斜杠

如果你不相信我,试试看

编辑:

更正:在命令中,您应该使用
$
CC=gcc
DEBUGFLAGS=-g
RELEASEFLAGS=-O
调试/%.o:%.c
$(CC)$(DEBUGFLAGS)-c$<-o$@
发行量/%.o:%.c
$(CC)$(RELEASEFLAGS)-c$<-o$@

%似乎不符合规则,但从其他方面看,您是对的。谢谢
CC=gcc
DEBUGFLAGS=-g
RELEASEFLAGS=-O
debug/%.o : %.c
    $(CC) $(DEBUGFLAGS) -c $< -o $@

release/%.o : %.c
    $(CC) $(RELEASEFLAGS) -c $< -o $@