【问题标题】:Why does make add rm commands I didn't specify? [closed]为什么 make add rm 命令我没有指定? [关闭]
【发布时间】:2019-04-20 13:31:04
【问题描述】:

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

【问题讨论】:

  • 您没有使用您在此处发布的 makefile。
  • @user657267 这是一个精确的副本。你为什么这么认为?
  • 对不起,我没有尝试多次运行它。

标签: assembly makefile nasm gnu-make ld


【解决方案1】:

make 删除它是因为它是一个中间文件,而不是因为您可能认为的 clean 目标。见chapter 10.4 Chains of Implicit Rules in the manual。相关引述:

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

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

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

另请注意,您可以使用-d 开关向make 询问有关它正在做什么的更多信息,该开关会打印出类似的内容:

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

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2015-09-24
    • 2017-07-19
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多