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

时间:2015-02-27 19:28:52

标签: c gcc compilation makefile

我在gcc中使用makefile。每个c文件都有一个附带的标题:

main.c main.h
test.c test.h

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

test.c包含test.h

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

我可以手动编写整个makefile并指定每个依赖项。编辑标题时,只重新编译必要的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头文件中。如果我想使用这种方法,我被迫用-B运行makefile。

我可以手动指定标题:

DEPS = main.h sort.h

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

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

如果我有大量文件,那么更新makefile中的每个更改都很难,并且使用自动化方法会增加编译时间。

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

2 个答案:

答案 0 :(得分:1)

您可以使用其他行指定main.o的其他依赖关系:

OBJ = main.o test.o

main.o: test.h

答案 1 :(得分:0)

如果您决定手动指定,那么您做错了;您不希望将依赖项添加到对每个目标文件生效的模式中。您可以为每个目标文件单独定义它,以便只有在正确的文件更改时才重建它们:

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

维护最后一行是自动依赖关系生成的,如果您决定尝试使用它。