1

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

4

1 回答 1

1

创建的依赖文件gcc MM将包含如下规则:

foo.o: stdio.h myinc.h # ...

并且这里的这一行包括列表中每个对象的依赖文件:

-include $(OBJS:.o=.d)

以 foo.d 为例。

据此

一个文件可以是多个规则的目标。所有规则中提到的所有先决条件都合并到目标的先决条件列表中。如果目标早于任何规则的任何先决条件,则执行配方。

因此,即使您有 rule %.o: %.c,include 语句也会导入使用依赖项扩展此规则的规则。

于 2013-05-19T21:31:57.223 回答