我的项目包括.c和.s(asm)文件。我使用' gcc'来编译这两种类型。并将输出的.o文件放到单独的目录' ./ bin'中。要做到这一点,我使用像这样的单个makefile规则
bin/%.o: %.[cs]
$(CC) $(CFLAGS) -o $@ -c $<
(据我所知,在这种情况下使用方括号通配符有点不合常规,但它有效且看起来很整洁,所以......)
前几天我决定将我的一些.c文件移到专用目录&#39; ./ common&#39;,所以我添加了
vpath %.c common
在makefile的开头。现在,每当我尝试制作&#39;时,它就会停止并在我移动的文件上引发错误。例如,对于&#39; common / foo.c&#39;我得到了
"*** No rule to make target bin/foo.o, needed by..."
好像我没有指定&#39; vpath&#39;。但是当我修改规则只编译.c文件时
bin/%.o: %.c
... ...
神奇地它再次开始正常运行并检查&#39; ./ common&#39;对于消息来源。
看起来像&#39; vpath&#39;机制和通配符不能一起工作,但我还是新手来制作&#39;并且渴望了解这种行为的确切原因。任何人的想法?提前谢谢。
(使用make-3.81和make-4.1测试。)
UPD:拥有所有文件和&#39; bin&#39;目录驻留在同一级别,如此
|-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 $<
现在,如果我搬家,说,&#39; foo.c&#39;分离目录并指定&#39; vpath&#39;,使用&#34生成停靠点;没有规则来生成ff.out&#34;所需的目标bin / foo.o。
答案 0 :(得分:0)
我建议仔细阅读How Not to Use VPATH,因为你似乎在某些地方而不是其他地方拥有OBJDIR的第三步。
要明确,使用静态模式规则并不能避免每个源目录至少需要一个规则,或者每个源目录至少需要一个make
个调用。因此,简单的答案是为新的common/
目录添加一个与另一个相同的新规则:
bin/%.o: common/%.[cs]
gcc -o $@ -c $<
有许多更全面但复杂的答案,请参阅以下文章中的部分内容。
对于简单项目,没有理由不通过添加额外规则来跟踪主Makefile中的目录。此外,没有bin/
目录和分割.o
和.out
位置是合理的情况。分销商和其他人希望能够控制从单独的目录创建文件的位置。
我根据你可能澄清事情的减少的例子抛出git repo with branches。