更改头文件时,我的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
以这种方式进行是一种常见的做法吗?我将如何更改代码以解决此问题?
答案 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)
(这需要您定义拥有的源文件)