我的项目包含.c和.s(asm)文件。我用'gcc'编译这两种类型,并将输出.o文件放在单独的目录'./bin'中。要做到这一点我使用单生成文件的规则是这样使用通配符搜索先决条件时,Makefile的'vpath'不起作用
bin/%.o: %.[cs]
$(CC) $(CFLAGS) -o [email protected] -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,使-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 [email protected] $^
bin/%.o: %.[cs]
gcc -o [email protected] -c $<
现在,如果我动,说“foo.c的”以独立的目录,并指定“VPATH”,停止建设“无规则,使目标bin/foo.o,由ff.out需要“。
发布原始生成文件的[mcve],为方括号指定没有特殊含义,因此它必须使用其内置规则,但是某些内容并不会增加您对行为的描述。 – user657267
@ user657267那么,'make'spec/4.3会告诉别人:方括号会以类似bash的方式作为通配符处理。我已经将MWE添加到了我的问题中。 –
对不起,你是对的,我不敢相信我不知道。 – user657267