【问题标题】:Why Makefile detects file even if it does not exist?为什么 Makefile 检测文件即使它不存在?
【发布时间】:2015-11-30 04:13:27
【问题描述】:

这是我的代码:

%.o: %.cpp 
    @mkdir -p bin/obj/$(@D) 
ifeq ($(wildcard bin/obj/$@),)
    $(CC) -c -o bin/obj/$@ $< $(CFLAGS) $(FLAGS)
else
    @echo "bin/obj/$@ exists"
endif

我有一个问题,当目录 obj 存在时,我总是得到错误。

我说的是这种情况:

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

我不知道如何解决它。

即使我将它从磁盘中删除,Makefile 也会始终打印该文件存在。

仅当我删除 obj 目录时才有效。

我该如何解决?

【问题讨论】:

    标签: linux makefile


    【解决方案1】:

    问题在于 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
    

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 1970-01-01
      • 2018-04-20
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多