使用 makefile 避免不必要的重新编译

Avoiding unecessary recompilation with makefile

我正在使用带有 gcc 的 makefile。每个 c 文件都有一个附带的 header:

main.c main.h
test.ctest.h

main.c 包括 main.h 和 test.h

test.c 包括 test.h

我想避免重新编译每个 c 文件。 Makefile 运行 没有 -B 参数。

我可以手动编写整个 makefile 并指定每个依赖项。编辑 headers 时,只会重新编译必要的 c 文件。 test.h 中的编辑将重新编译两个 c 文件,而 main.h 中的更改只会重新编译 main.c。应该的。

当我切换到更自动化的方法时,这不起作用:

OBJ = main.o test.o

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

main: $(OBJ)
    $(CC) -o main $(OBJ) 

test.h 中的更改只会重新编译 test.c。将 main.c 保留在旧版本 test.h header 中。如果我想使用这种方法,我不得不 运行 使用 -B 生成文件。

我可以手动指定 headers:

DEPS = main.h sort.h

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

然后 main.h 中的更改会重新编译 main.c 和 test.c,后者是不必要的。

如果我有很多文件,更新 makefile 中的每个更改会很麻烦,使用自动化方法会增加编译时间。

是否有更好的解决方案,一个只重新编译所需文件的解决方案,或者手动指定所有内容的唯一方法?

您可以使用另一行指定 main.o 的附加依赖项:

OBJ = main.o test.o

main.o: test.h

但是,如果您决定手动指定,那您就错了;您不想将依赖项添加到它对 每个 目标文件生效的模式。您为每个目标文件分别定义它,因此只有在正确的文件发生变化时才会重建它们:

OBJ = main.o test.o

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

main: $(OBJ)
        $(CC) -o main $(OBJ)

main.o: main.h test.h
test.o: test.h

如果您决定要尝试使用它,那么维护最后几行是自动依赖项生成所做的。