在makefile中使用带有-MMD的g ++来自动生成依赖项

Nan*_*ncy 15 dependencies makefile g++

我知道以下makefile会让预处理器自动生成依赖项(在.d文件中)并将它们包含在makefile中(因为我的课程说明是这样说的),这样它们就不必自动维护了.该-MMD标志是什么是负责这一点.我没有得到的是:.d文件在什么时候生成?甚至没有${CXXFLAGS}使用任何命令.据推测,类似的命令${CXX} ${CXXFLAGS} -c x.C -o x.o将由每个目标文件的make自动推断,但如果这些是生成.d文件的命令,我们是不是已经通过了知道xo,yo和zo的依赖关系的点如果我们只通过执行生成这些.o文件的命令来了解它们,那么它们是否相关?(假设有.h文件,如果留下来自己推断规则,makefile会忽略.)

CXX = g++                     # compiler
CXXFLAGS = -g -Wall -MMD      # compiler flags
OBJECTS = x.o y.o z.o         # object files forming executable
DEPENDS = ${OBJECTS:.o=.d}    # substitutes ".o" with ".d"
EXEC = a.out                  # executable name

${EXEC} : ${OBJECTS}          # link step
    ${CXX} ${OBJECTS} -o ${EXEC}

-include ${DEPENDS}           # copies files x.d, y.d, z.d (if they exist)
Run Code Online (Sandbox Code Playgroud)

por*_*ges 12

据推测,类似的命令${CXX} ${CXXFLAGS} -c x.C -o x.o将由每个目标文件的make自动推断,但如果这些是生成.d文件的命令,我们是不是已经通过了知道xo,yo和zo的依赖关系的点如果我们只通过执行生成这些.o文件的命令来了解它们,那么它们是否相关?

你在这里是对的.第一次运行Makefile时,依赖项不存在.

但这并不重要 - 仅当.o文件已存在且您已更改.h文件时才需要依赖性信息.第一次运行Make时,无论如何都需要构建所有.o文件,并且同时生成.d文件.

之后,.d文件将提供依赖性信息.如果更改了标头,则依赖关系信息将告知Make哪些.o文件需要重建.如果更改了源文件,则始终需要重建.o,并且将同时生成更新的依赖项信息.