c - 为什么当头文件更改时 makefile 会重新编译所有内容?

标签 c makefile

当头文件更改时,我的 makefile 会重新编译所有内容,如何才能使其仅重新编译所需的文件? a_functions.c 使用 a.h 为例。

每当我更改 .c 文件时,makefile 只会将该文件重新编译为对象。

SHELL=/bin/sh
CC=gcc
CFLAGS=-Wall
OBJECTS=main.o a_functions.o b_functions.o c_functions.o d_functions.o
DEPS=main.h a.h b.h c.h d.h
PROGRAM_NAME=program1
INSTALL_PATH=/usr/local/bin

%.o: %.c $(DEPS)
    $(CC) -c $(CFLAGS) $< -o $@

.PHONY: all
all: $(PROGRAM_NAME)

$(PROGRAM_NAME): $(OBJECTS)
    $(CC) $(OBJECTS) -o $(PROGRAM_NAME)

.PHONY: install
install: $(PROGRAM_NAME)
    install -c $(PROGRAM_NAME) $(INSTALL_PATH)/

.PHONY: uninstall
uninstall:
    rm -v $(INSTALL_PATH)/$(PROGRAM_NAME)

.PHONY: clean
clean:
    rm -v $(PROGRAM_NAME) *.o

如果我更改下面的头文件,就会发生

$ make
gcc -c -Wall main.c -o main.o
gcc -c -Wall a_functions.c -o a_functions.o
gcc -c -Wall b_functions.c -o b_functions.o
gcc -c -Wall c_functions.c -o c_functions.o
gcc -c -Wall d_functions.c -o d_functions.o
gcc main.o a_functions.o b_functions.o c_functions.o d_functions.o -o program1

当我更改 .c 文件时,会发生这种情况,这也是我希望所有 header 都发生的情况。

$ make
gcc -c -Wall a_functions.c -o a_functions.o
gcc main.o a_functions.o b_functions.o c_functions.o d_functions.o -o program1

希望这样是常见的做法吗?我该如何更改代码来解决该问题?

最佳答案

您有一条规则,规定从 .c 文件构建的所有 .o 文件也依赖于 $(DEPS) 的内容

%.o: %.c $(DEPS)
    $(CC) -c $(CFLAGS) $< -o $@

其中似乎包含您所有的 .h 文件。

DEPS=main.h a.h b.h c.h d.h

您应该从该规则中删除 $(DEPS) 并专门为每个 .o 文件指定依赖项,如下所示:

a_functions.o: a.h
main.o: a.h b.h

如果您已经安装了它,您可以使用 makedepend 来完成“繁重的工作”并为您确定依赖项并更新您的 Makefile。甚至像这样添加它作为规则

depend:
    makedepend -- $(CFLAGS) -- $(SRCS)

(这需要您定义您拥有的源文件)

关于c - 为什么当头文件更改时 makefile 会重新编译所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53759743/

相关文章:

c++ - 如何将二进制表示字节转储为十进制字符串?

c - 终端中非常奇怪的 "fake numbers"

c - SetEvent 是否解除阻塞一个或所有等待线程?

c - fork 三个子进程会产生奇怪的随机输出

gcc - 在 GCC makefile 的目标中允许空间

c - 打印pid和errno

c++ - 我可以将 src/中的所有 .cpp 文件编译为 obj/中的 .o,然后链接到 ./中的二进制文件吗?

c - GCC 上的 Makefile for C

architecture - cmake - 创建架构感知 makefile

android - 使 : *** No targets specified and no makefile found. 停止