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

时间:2015-02-14 15:23:11

标签: gcc assembly makefile gnu-make

我只使用隐式规则 - 完全删除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

1 个答案:

答案 0 :(得分:4)

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

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

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