Linux 为什么Makefile即使不存在也会检测文件?

Linux 为什么Makefile即使不存在也会检测文件?,linux,makefile,Linux,Makefile,这是我的密码: %.o: %.cpp @mkdir -p bin/obj/$(@D) ifeq ($(wildcard bin/obj/$@),) $(CC) -c -o bin/obj/$@ $< $(CFLAGS) $(FLAGS) else @echo "bin/obj/$@ exists" endif %.o:%.cpp @mkdir-p bin/obj/$(@D) ifeq($(通配符bin/obj/$@),) $(CC)-c-o bin/obj/$

这是我的密码:

%.o: %.cpp 
    @mkdir -p bin/obj/$(@D) 
ifeq ($(wildcard bin/obj/$@),)
    $(CC) -c -o bin/obj/$@ $< $(CFLAGS) $(FLAGS)
else
    @echo "bin/obj/$@ exists"
endif
%.o:%.cpp
@mkdir-p bin/obj/$(@D)
ifeq($(通配符bin/obj/$@),)
$(CC)-c-o bin/obj/$@$<$(CFLAGS)$(标志)
其他的
@回显“bin/obj/$@存在”
恩迪夫
我有一个问题,当目录obj存在时,我总是得到false

我说的是这种情况:

($(通配符bin/obj/$@),)

我不知道怎么修理它

Makefile始终打印存在的文件,即使我将其从磁盘中删除

它只在我删除obj目录时起作用


如何修复它?

问题在于Make在执行规则之前计算条件,而
$@
尚未定义(并且可能尚未创建文件)。通配符语句的计算结果为
$(wildcard/bin/obj/)
,如果目录存在,它将生成“bin/obj/”,我想它会这样做

解决这个问题的方法不止一种。最直接的方法是将条件放入命令中,以便Make将其传递给shell:

%.o: %.cpp
    @mkdir -p bin/obj/$(@D)
    @if [ -e bin/obj/$@ ]; then echo it exists; else $(CC) ...; fi