为什么我的 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 使用最短的一组步骤。
我只使用隐式规则 - 为最小测试用例完全删除 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 使用最短的一组步骤。