如何在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
。
我从 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
。