【发布时间】:2017-05-04 15:11:31
【问题描述】:
我的项目包括 .c 和 .s (asm) 文件。我用'gcc'编译这两种类型并将输出.o文件放到单独的目录'./bin'中。为此,我正在使用像这样的单个 makefile 规则
bin/%.o: %.[cs]
$(CC) $(CFLAGS) -o $@ -c $<
(据我了解,在这种情况下使用方括号通配符有点不合常规,但它很有效,而且看起来很整洁,所以......)
前几天我决定将我的一些 .c 文件移动到专用目录 './common',所以我添加了
vpath %.c common
在生成文件的开头。现在,每次我尝试“制作”时,它都会停止并在我移动的文件上抛出错误。例如,对于 'common/foo.c' 我得到
"*** No rule to make target bin/foo.o, needed by..."
好像我没有指定'vpath'。但是当我修改规则只编译 .c 文件时
bin/%.o: %.c
... ...
神奇地它再次开始正常运行并检查 './common' 的来源。
看起来'vpath'机制和通配符不能一起工作,但我对'make'仍然很陌生,并且渴望了解这种行为的确切原因。有什么想法吗?提前致谢。
(使用 make–3.81 和 make–4.1 测试。)
UPD:让所有文件和“bin”目录位于同一级别,就像这样
|-bin/
|-foo.c
|-bar.s
|-baz.c
|-Makefile
这里是 MWE
ROOTS = foo.o bar.o
OBJS = baz.o
SS = $(addprefix bin/,$(ROOTS) $(OBJS))
all: ff.out
ff.out: $(SS)
ld -o $@ $^
bin/%.o: %.[cs]
gcc -o $@ -c $<
现在,如果我将 'foo.c' 移动到单独的目录并指定 'vpath',构建会停止并显示“没有规则来制作目标 bin/foo.o,ff.out 需要”。
【问题讨论】:
-
发布您原始makefile的minimal reproducible example,make没有为方括号分配特殊含义,因此它必须使用其内置规则,但您对行为。
-
@user657267 好吧,'make' spec/4.3 另有说明:方括号以类似 bash 的方式被视为通配符。我已将 MWE 添加到我的问题中。
-
对不起,你是对的,我不敢相信我不知道。