我只使用隐式规则 - 完全删除makefile以获得最小的测试用例。我有一个空的(GNU汇编程序没问题)program.s
文件。执行:
make program
给我以下来自make的输出:
cc program.s -o program
(当然还有预期的错误,这对于这个问题并不重要:因为我的汇编源文件是空的,没有" _start"并且所有类型的链接都失败了。)
我想知道,为什么选择尝试一次性构建程序?与首先使用as program.s ...
然后使用ld program.o ...
相反?这是因为它在我的场景中认为对象文件是不必要的吗?
如果我make program.o
,则调用as program.as ...
,按预期生成program.o
。
答案 0 :(得分:4)
Make总是会选择one-step implicit rules而不是多步隐式规则,以获得相同的结果。在这种情况下,make包含内置规则,这些规则既可以从目标文件创建可执行文件,也可以直接从包括程序集在内的各种源文件创建:
%: %.s
# recipe to execute (built-in):
$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
由于这比首先构建.o
然后从.o
构建可执行文件要短,并且因为你的makefile没有说你想要.o
,所以make使用最短的集合步骤。