在这里,本教程非常漂亮地解释了它,并且大部分都可以正常工作。以下是本教程中的最终 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
文件中的依赖项包含到依赖项列表中。