为什么要执行我未指定的add rm命令?

时间:2018-11-17 17:00:37

标签: assembly makefile nasm gnu-make ld

我刚刚创建了一个通用的makefile来编译和链接汇编程序文件:

AS=nasm
ASFLAGS=-g -f elf64
LDFLAGS=-m elf_x86_64 -static
BINARIES=print_args64

all: $(BINARIES)

%: %.o
        $(LD) $(LDFLAGS) -o $@ $<

%.o: %.asm
        $(AS) $(ASFLAGS) -o $@ $<

clean:
        $(RM) $(BINARIES) $(wildcard *.o)

我正在运行make all

nasm -g -f elf64 -o print_args64.o print_args64.asm
ld -m elf_x86_64 -static -o print_args64 print_args64.o

但是实际上它在下面为该对象添加了一个rm命令:

 rm print_args64.o

这是哪里来的,我该如何避免?

我找不到与此相关的任何文档。

问候,bvolkmer

1 个答案:

答案 0 :(得分:4)

make删除了它,因为它是一个中间文件,而不是因为您可能会想到的clean目标。参见chapter 10.4 Chains of Implicit Rules in the manual。相关报价:

  

第二个区别是,如果make确实创建b以便更新   其他,它将在不再需要后删除b。   因此,make之前不存在的中间文件也   make后不存在。 make通过以下方式向您报告删除情况   打印“ rm -f”命令,显示要删除的文件

  

您可以通过标记来防止自动删除中间文件   它作为辅助文件。为此,请将其列为   特殊目标。SECONDARY。当文件是辅助文件时,make不会   创建文件仅仅是因为它尚不存在,而是   不会自动删除文件。将文件标记为辅助文件   还将其标记为中间。

     

您可以将隐式规则(例如“%.o”)的目标模式列出为   保留特殊目标.PRECIOUS的先决条件   由目标规则匹配的隐式规则制作的中间文件   该文件的名称

还请注意,您可以使用make开关向-d询问有关其操作的更多信息,该开关显示类似以下内容:

Successfully remade target file `all'.
Removing intermediate files...
rm print_args64.o