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

时间:2018-12-13 10:27:53

标签: 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文件时,也会发生这种情况,这也是我想要所有标头的原因。

$ 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

以这种方式进行是一种常见的做法吗?我将如何更改代码以解决此问题?

1 个答案:

答案 0 :(得分:1)

您有一条规则说,所有从.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)

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