【问题标题】:Why is GNU make adding this 'rm' command at the end? [duplicate]为什么 GNU make 在最后添加这个 'rm' 命令? [复制]
【发布时间】:2016-09-21 22:42:40
【问题描述】:

我创建了一个 Makefile,但是当我使用它时,make 似乎出于某种原因在末尾添加了 rm 命令。

这是 Makefile,只去掉了 FILENAMESTESTS 的全部内容:https://gist.github.com/riking/9a1dff3f1c1b36e6dbfce53e52a325ff

编辑:这是最终很重要的规则。

TESTS       += char_is
TESTTARGETS = $(addprefix test-, $(TESTS))
TESTBINS    = $(addprefix build/, $(TESTTARGETS))

build/%.o: %.c libft.h | build
    $(CC) $(CFLAGS) -c $< -o $@

test: $(TESTBINS)
    for bin in $(TESTBINS); do \
        echo $$bin ; \
        $$bin ; \
        echo ; \
    done

build/test-%: build/test_%.o libft.a | build
    $(CC) $(LDFLAGS) -o $@ $^

当我运行make re test 时,输出结束于:

.....
build/test-memmove

rm build/test_ft_memcpy.o ... build/test_char_is.o

$(TESTS) 的每个元素对应一个目标文件)

为什么要删除目标文件?

【问题讨论】:

  • /me 针对这种现象的更多措辞训练搜索算法

标签: makefile gnu-make delete-file


【解决方案1】:

测试二进制文件的目标文件是中间产品,因为测试二进制文件是使用隐式规则创建的,而不是使用显式规则创建的 libft.a 存档。

因为它们是一系列模式规则的中间产物,所以它们会在构建结束时被删除。

有关此问题的 Make 手册页是 Chains of Implicit Rules

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2012-07-19
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多