【问题标题】:make don't build file even if dependency is updated即使更新了依赖项,也不要构建文件
【发布时间】:2017-11-17 16:43:43
【问题描述】:

这是我的制作文件:-

VER = Debug
CC = g++

OBJECTFIELS = main.o Time.o

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

$(OBJECTFILES): Time_.h

clean:
    rm $(OBJECTFIELS) main

每次我更改 Time_.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

拜托,我完全是菜鸟。请告诉为什么会发生这种情况

【问题讨论】:

  • 错字:您的变量名为OBJECTFIELS,但您尝试将其用作OBJECTFILES
  • @melpomene 谢谢!!!我又傻又疯了

标签: makefile gnu-make


【解决方案1】:

您需要在 Time_.h 规则中生成新的 .o 文件。

$(OBJECTFILES): Time_.h

这表示只要 Time_.h 更新,make 应该运行一个命令,并且该命令将生成 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_.h 发生更改时才需要运行它。

我明确指定“Time.o”,因为您的源文件名似乎与您期望的目标文件不完全匹配。 (Time.o vs Time_.o)

【讨论】:

  • 但是手册说我可以使用这个 sysntax:- gnu.org/software/make/manual/html_node/…
  • 我现在会避免这种风格...有关标准 makefile 格式,请参见此处:gnu.org/software/make/manual/html_node/…
  • 这些都不是必需的。 Make 知道如何从源文件构建目标文件,如果它们对您有用,则使用内置规则是完全合理的,并且不能避免。问题中的原始makefile是完全正确的,不需要修改,除了上面cmets中提到的变量名中的错字。
  • 其实这个例子中给出的规则是不正确的,因为它缺少作为先决条件的源文件。
  • 澄清一下:$(OBJECTFILES): Time_.h 表示目标文件(Time.omain.o)依赖于 Time.h。因为没有定义配方,意味着它只是一个依赖声明,它会从其他地方获取配方——即%.o的默认模式规则。
猜你喜欢
  • 2021-12-16
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2020-11-30
  • 2015-02-28
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多