如何在make中管理c文件依赖

how to manage c files dependencies in make

我从 make 开始,我正在搜索如何为我的 c 文件自动生成依赖项,我找到了这段代码:

# pull in dependency info for *existing* .o files
-include $(OBJS:.o=.d)


# compile and generate dependency info
%.o: %.c
    gcc -c $(CFLAGS) $*.c -o $*.o
    gcc -MM $(CFLAGS) $*.c > $*.d

我不明白的是当我生成依赖文件 %.d 时,我已经构建了 %.o 文件,所以创建这个依赖文件和我之前执行的 -include 有什么意义一切都不会存在依赖文件。

-include 表示如果有 dep 文件则包含它,如果不存在则不失败。

这个技巧在 make 依赖项跟踪中很常见,是您的依赖项实际上是一个过时的构建。如果它们存在,您将包括上次构建的依赖文件。

这不是问题,因为要更改依赖项,必须对上次构建期间目标所依赖的内容进行更改——因此即使 make 不知道完整的新依赖项,它也知道它必须重建目标(并在此过程中生成一个新的依赖文件)。

附录:顺便说一下,gcc 和 clang 有一个 -MD 选项,可以在构建 .o 时生成依赖文件(默认带有 .d 后缀)。这意味着您可以使用隐式规则进行自动依赖跟踪,并将 Makefile 减少到最低限度,就像这样(对于一个简单的项目,在一个平面目录中有 .c 个文件):

#!/usr/bin/make -f

# name of the binary to build
TARGET   = target

CC       = gcc

# These flags are used by the implicit rules for C preprocessor flags,
# C compiler flags, linker flags, and libraries to link (-lfoo options)
# -MD in CPPFLAGS means that the implicit rules for .o files will also
# generate a corresponding .d file that contains the dependencies.
# The values here are just examples (thank you, Rear Admiral Obvious!)
CPPFLAGS = -MD -I somewhere/include
CFLAGS   = -O2 -g
LDFLAGS  = -L somewhere/lib
LDLIBS   = -lsomelibrary

# SRCS is a list of all .c files in the directory, the other two are
# pattern substitution expressions that take SRCS and replace the .c with .o
# and .d, respectively
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)

all: $(TARGET)

$(TARGET): $(OBJS)

# Look, Ma, no explicit rules for .o files!

clean:
    rm -f $(TARGET) $(OBJS)

.PHONY: all clean

# include dep files (if available).
-include $(DEPS)

我通常添加虚假目标 depend,像这样:

depend: $(SOURCES)
        makedepend -Y. $(CFLAGS) $^ 2>/dev/null

和运行 make depend 不时更新依赖项。 有关详细信息,请参阅 man makedepend