我刚刚创建了一个通用的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
答案 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