Makefile 使don';即使依赖项已更新,也不会生成文件

Makefile 使don';即使依赖项已更新,也不会生成文件,makefile,gnu-make,Makefile,Gnu Make,这是我的制作文件:- VER = Debug CC = g++ OBJECTFIELS = main.o Time.o main: $(OBJECTFIELS) $(CC) $(OBJECTFIELS) -o $@ $(OBJECTFILES): Time_.h clean: rm $(OBJECTFIELS) main 每次我更改time_h.h文件时,都不会发生任何事情:- $ make make: 'main' is up to date. $ touch Tim

这是我的制作文件:-

VER = Debug
CC = g++

OBJECTFIELS = main.o Time.o

main: $(OBJECTFIELS)
    $(CC) $(OBJECTFIELS) -o $@

$(OBJECTFILES): Time_.h

clean:
    rm $(OBJECTFIELS) main
每次我更改time_h.h文件时,都不会发生任何事情:-

$ make
make: 'main' is up to date.
$ touch Time_.h 
$ make
make: 'main' is up to date.
其他文件在更改时编译:-

$ touch main.o
$ make
g++ main.o Time.o -o main

求你了,我完全是傻瓜。请说明发生这种情况的原因

您需要在规则中为Time\uh生成新的.o文件

$(OBJECTFILES): Time_.h
这意味着make应该在Time.h更新时运行一个命令,该命令将同时生成main.o和Time.o。但是没有命令

Time.o: Time_.h
        $(CC) Time_.cpp -o Time.o
这是你想要的规则。每当Time.h改变时,我们运行$(CC)Time.cpp-o Time.o,它将生成Time.o。现在,如果其他一些规则依赖于Time.o,make将知道此命令可用于创建Time.o,但它只需要在自上次运行make以来Time_uh发生更改的情况下运行


我显式地指定了“Time.o”,因为您的源文件名似乎与您期望的对象文件不完全匹配。(Time.o vs Time.o)

Typo:您的变量名为
OBJECTFIELS
,但您正试图将其用作
对象文件
@melpomene谢谢!!!我是如此愚蠢和疯狂,但手册上说我可以使用这个sysntax:-我现在会避免那种风格。。。请参见此处了解标准makefile格式:这些都不是必需的。Make知道如何从源文件构建对象文件,如果内置规则适用于您,那么使用内置规则是完全合理的,而且是不可避免的。问题中的原始makefile是完全正确的,不需要修改,除了上面注释中提到的变量名中的打字错误。实际上,本例中给出的规则是不正确的,因为它缺少源文件作为先决条件。只需澄清:
$(OBJECTFILES):Time_uz.h
表示目标文件(
Time.o
main.o
)依赖于
Time.h
。因为没有定义配方,这意味着它只是一个依赖项声明,它将从其他地方获取配方——即
%.o
的默认模式规则。