C 是否需要在makefile中包含头文件?

C 是否需要在makefile中包含头文件?,c,makefile,C,Makefile,我正在学习Makefiles,现在我真的很困惑。我已经写了一篇,现在我在胡闹,我发现如果我 bin/queueDriver.o:src/queueDriver.c include/queue.h ${CC} ${CFLAGS} -o bin/queueDriver.o -c src/queueDriver.c 在我的makefile中,项目仍然正确地构建和执行。为什么会这样?make规则行中冒号后面的名称是依赖项。如果任何依赖项的修改时间比规则的目标最近,则执行该规则。(目标通常是一

我正在学习Makefiles,现在我真的很困惑。我已经写了一篇,现在我在胡闹,我发现如果我

bin/queueDriver.o:src/queueDriver.c include/queue.h 
    ${CC} ${CFLAGS} -o bin/queueDriver.o -c src/queueDriver.c

在我的makefile中,项目仍然正确地构建和执行。为什么会这样?

make规则行中冒号后面的名称是依赖项。如果任何依赖项的修改时间比规则的目标最近,则执行该规则。(目标通常是一个名称与规则名称相同的文件,尽管存在例外。)

如果删除任何依赖项,则目标仍可能生成,但即使更改其所依赖的文件,也不会重新生成(这可能会导致更大范围内的生成中断,例如,当您尝试将从不同版本的头文件生成的两个对象链接在一起时)


查找给定源文件所依赖的所有头文件通常是不可能的,因此通常会使用各种辅助工具来自动生成依赖项。请注意,您可以稍后添加依赖项:

/include/queue.h 

但总而言之,
make
是一个非常低级的构建工具,通常只用于非常小的项目或其他构建系统(例如autotools或cmake)的后端。

我想有些人喜欢旧技术

make文件只保存A、b、c,如果比x新,则保存buildx

所以

本质上是结构

因此,只要不修改头文件,就可以删除头文件


但是请考虑其他技术,比如SCONS,Gradle……/P>当然还有CMake!Make是一个有用的工具,但是C项目的Make文件需要以某种方式生成。非常感谢。这是通过我的大学,我不确定人们是否仍然是这样做的。@Kos-不,他们是这样做的not@EdHeal他们这样做(无论是CMake还是一些手工设置,包括
gcc-M
),硬编码或忽略deps都是在自取灭亡谢谢!这很有道理!
foo.o: foo.c      ## Manually written rule
        $(CC) -c -o $@ $^

## added later, e.g. by a tool
foo.o: foo.h
foo.o: bar.h
x: a, b, c
  do this