Here本教程非常精美地解释了它并且大部分工作正常。以下是本教程中的最终Makefile,它假定您具有如下目录结构:
root-----Makefile
|-----All source files here.
编译结果应位于root
目录中。以下是Makefile:
OBJS := foo.o bar.o
# link
proggie: $(OBJS)
gcc $(OBJS) -o proggie
# pull in dependency info for *existing* .o files
-include $(OBJS:.o=.d) #NOTE THIS
%.o: %.c #NOTE THIS
gcc -c $(CFLAGS) $*.c -o $*.o
gcc -MM $(CFLAGS) $*.c > $*.d
@cp -f $*.d $*.d.tmp
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
@rm -f $*.d.tmp
# remove compilation products
clean:
rm -f proggie *.o *.dOBJS := foo.o bar.o
我在教程中只理解一件事。它表示pull in dependency info for *existing* .o files
和相应的.d
文件,但是如何处理这些文件,因为仍然保留%.o: %.c
的目标的依赖项列表没有进行任何更改。
事实上,从我注意到它对我来说不起作用。任何人都可以解释这里发生了什么。如果本教程错误(我非常怀疑)那么请提及我们如何将.d
文件中的依赖项包含在依赖项列表中。
答案 0 :(得分:1)
使用gcc MM
创建的依赖项文件将包含以下规则:
foo.o: stdio.h myinc.h # ...
这里的这一行包括列表中每个对象的依赖文件:
-include $(OBJS:.o=.d)
例如,请查看foo.d。
一个文件可以成为多个规则的目标。所有规则中提到的所有先决条件都合并到目标的一个先决条件列表中。如果目标比任何规则中的任何先决条件旧,则执行配方。
因此,即使您拥有规则%.o: %.c
,include语句也会导入使用依赖项扩展此规则的规则。