makefile不分别用.h文件更新.o文件

时间:2017-12-08 20:10:41

标签: c makefile

我有以下make文件: -

VER = Debug
CC = gcc
objectfiles = Getstr.o ui.o ustreqsol.o main.o
pkg = `pkg-config --cflags --libs gtk+-3.0` 

obj = $(addprefix objs/,$(objectfiles))

../$(VER)/Calculator: $(obj)
    $(CC) -o $@ $(obj) $(pkg)

./objs/ui.o:ui.c
    $(CC) -c -o $@ $< $(pkg)

./objs/main.o:main.c
    $(CC) -c -o $@ $< $(pkg)

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

clean:
    -rm ../$(VER)/Calculator
    -rm /objs/*

以及我的src目录中的文件: -

$ ls 
Getstr.c  main.c  Makefile  objs  ui.c  ui.h  ustreqsol.c  ustreqsol.h

objs是目录。当我更改ustreqsol.h文件时,它会编译ustreqsol.c文件,但不能用于ui.h文件

$ touch ustreqsol.h
$ make
gcc -c -o objs/ustreqsol.o ustreqsol.c
gcc -o ../Debug/Calculator objs/Getstr.o objs/ui.o objs/ustreqsol.o objs/main.o `pkg-config --cflags --libs gtk+-3.0` 
$ make
make: '../Debug/Calculator' is up to date.
$ touch ui.h
$ make
make: '../Debug/Calculator' is up to date.

作为makefile中的菜鸟,我不知道为什么会发生这种情况

1 个答案:

答案 0 :(得分:1)

ui.c没有被重建的原因是因为你明确地说ui.h不是依赖:

./objs/ui.o:ui.c
    $(CC) -c -o $@ $< $(pkg)

对于您设置的一般依赖项:

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

依赖关系列表仅对您未明确设置它们的文件生效,例如ustreqsol.c。

您需要为每个目标文件添加目标,指定每个目标文件的依赖项。目标可以为空白,因为%.o目标将填写要执行的操作。

例如:

./objs/ustreqsol.o: ustreqsol.c ustreqsol.h ui.h

./objs/ui.o: ui.c ui.h

./objs/main.o: main.c ui.h ustreqsol.h

./objs/Getstr.o: Getstr.c

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