C makefile未分别使用.h文件更新.o文件

C makefile未分别使用.h文件更新.o文件,c,makefile,C,Makefile,我有以下文件:- 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)

我有以下文件:-

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/*
objs是目录。当我更改ustreqsol.h文件时,它编译ustreqsol.c文件,但不编译ui.h文件的case

$ 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.

作为makefiles中的noob,我不知道为什么会发生这种情况

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

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

/objs/%.o:%.c%.h
-这表示“如果
x.c
x.h
已经更改,则重建
x.o
”。@OliverCharlesworth但当我更改ui.h时,它应该重建ui.o,但这不是完美的答案。请注意,
ui.o
规则可能是无用的,在
ustreqsol.o
规则中,您可能只有
ui.h
先决条件。
./objs/ui.o:ui.c
    $(CC) -c -o $@ $< $(pkg)
./objs/%.o: %.c %.h
    $(CC) -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 $@ $<