为什么我的 GNU make 在构建 %.s(汇编程序)程序时会跳过创建目标文件 (%.o)?

Why does my GNU make skip making an object file (%.o) when building an %.s (assembler) program?

我只使用隐式规则 - 为最小测试用例完全删除 makefile。我有一个空的(对于 GNU 汇编程序没有问题)program.s 文件。正在执行:

make program

给我以下 make 的输出:

cc    program.s   -o program

(当然还有预期的错误,这对问题来说并不重要:因为我的汇编程序源文件是空的,所以没有“_start”,各种链接都失败了。)

我想知道,为什么make选择尝试一次构建程序?与先使用 as program.s ... 然后再使用 ld program.o ... 相对?这是因为它认为目标文件在我这里的场景中是不必要的吗?

如果我这样做 make program.o,则会调用 as program.as ...,按预期生成我的 program.o

Make 将始终优先选择 one-step implicit rules 而不是多步隐式规则,以获得相同的结果。在这种情况下,make 包含内置规则,既可以从目标文件创建可执行文件,也可以直接从包括程序集在内的各种源文件创建可执行文件:

%: %.s
#  recipe to execute (built-in):
        $(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@

因为这比首先构建 .o 然后从 .o 构建可执行文件要短,并且由于您的 makefile 没有说您想要 .o,make 使用最短的一组步骤。