7

Make 的隐含规则据说可以使编写 Makefile 更容易,但是,如果我的理解是正确的,如果我的 C 文件依赖于任何头文件,我需要明确地编写规则。我对吗?这似乎严重降低了隐式规则的有用性,因为大多数 C 文件都依赖于几个头文件,所以我想也许我缺少一些东西。

4

3 回答 3

8

您可以使用以下 makefile 片段使用 gcc 自动生成头文件依赖项

SOURCES := $(wildcard *.c)
DEPS := $(SOURCES:%.c=%.d)
CFLAGS += -MMD

-include $(DEPS)

代码可能需要一些调整才能与您的特定规则集一起使用。

于 2012-05-09T18:00:55.783 回答
6

您不需要编写规则,只需要编写依赖项。例子:

foo.o : foo.h bar.h

文件 foo.o 仍将由隐式规则生成,但具有额外的依赖项foo.hbar.h. 大多数编译器也可以自动生成此依赖行。

于 2012-05-09T17:22:14.450 回答
2

make不是一个实用程序,会在您的 C 文件中读取并确定它包含哪个标头。它基于文件更改的时间戳工作。因此,无论目标是依赖于头文件还是任何其他文件,您都需要明确告知make依赖关系。

gcc可以通过像这样为您生成依赖项列表来帮助您减轻工作

主程序

#include<stdio.h>
#include"my_header.h"

int main ()
{
return 0;
}

进而,

gcc -M main.c

现在,使用-M预处理器标志,它会自动生成一个依赖列表,如

main.o: main.c /usr/include/stdio.h /usr/include/features.h \
 /usr/include/bits/predefs.h /usr/include/sys/cdefs.h \
 /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \
 /usr/include/gnu/stubs-64.h \
 /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stddef.h \
 /usr/include/bits/types.h /usr/include/bits/typesizes.h \
 /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
 /usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/include/stdarg.h \
 /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \
 my_header.h

gcc也已经弄清楚了里面的所有内容stdio.h

于 2012-05-09T17:18:37.150 回答