Makefile Make:即使先决条件存在,也会运行配方

Makefile Make:即使先决条件存在,也会运行配方,makefile,gnu,prerequisites,Makefile,Gnu,Prerequisites,我很难理解为什么Make会运行“lib”——即使文件已经存在。 只要“$(LIBBIN)”不在.PHONY中,就应该忽略它吗 这里是一个有问题的Makefile的摘录(ts=2,请参阅“TODO”) 我希望你们中的一位大师知道答案;-) 亲切问候,, 瑜伽1212 编辑:也许我应该说,我已经试着做了预需求。仅限lib和所有订单。没有明显的效果 编辑2:事实证明这确实有效。链接文件似乎有一个时间戳,关闭了一分钟,make被弄糊涂了。 在重新创建文件夹结构并重新启动后,这种现象消失了。由于您的示例中

我很难理解为什么Make会运行“lib”——即使文件已经存在。 只要“$(LIBBIN)”不在.PHONY中,就应该忽略它吗

这里是一个有问题的Makefile的摘录(ts=2,请参阅“TODO”)

我希望你们中的一位大师知道答案;-)

亲切问候,, 瑜伽1212

编辑:也许我应该说,我已经试着做了预需求。仅限lib和所有订单。没有明显的效果

编辑2:事实证明这确实有效。链接文件似乎有一个时间戳,关闭了一分钟,make被弄糊涂了。
在重新创建文件夹结构并重新启动后,这种现象消失了。

由于您的示例中缺少详细信息,在我对其进行简化后,您给出的makefile部分是正确的,适用于我。所以,你的例子并不能准确地反映你的情况。请尽量提供一个


你说得对。我将整个项目复制到另一个分区,它按预期工作。不过,在重新启动计算机之前,原始副本无法工作
.PHONY: all clean default apps lib examples

default: lib

all: apps lib examples

apps: $(APPBINS)

lib: $(LIBBIN)

examples: $(EXBINS)

$(LIBBIN): % : %.$(VERSION)
# TODO -f should really not be necessary. why is the recipe run, when the file exists?
  ln -sf $^ $@

$(LIBBIN).$(VERSION): $(LIBOBJECTS) | $(LIBOUTDIR)
  $(CC) $^ -o $@ $(LIBLDFLAGS)
  chmod 755 $@
$ cat Makefile
LIBBIN = /tmp/foo
VERSION = 1.0

lib: $(LIBBIN)

$(LIBBIN): % : %.$(VERSION)
        ln -s $^ $@

$(LIBBIN).$(VERSION): $(LIBOBJECTS) | $(LIBOUTDIR)
        touch $@

$ make
touch /tmp/foo.1.0
ln -s /tmp/foo.1.0 /tmp/foo

$ make -f /tmp/x3.mk 
make: Nothing to be done for `lib'.