Makefile for Assembly使用隐式规则而不是显式规则

时间:2017-10-25 08:42:09

标签: assembly makefile

我创建了以下简单的Makefile,使用.s.o文件编译成as个文件,然后使用ld链接它们:

AS=as
LD=ld

ASFLAGS=-g
LDFLAGS=

targets = rpn cpuid_write cpuid_printf cpuid1 foo decode2 359

all: $(targets)

%: %.o
        $(LD) $< -o $@ $(LDFLAGS)

%.o: %.s
        $(AS) $< -o $@ $(ASFLAGS)

.PHONY: clean

clean:
        rm -f *.o  $(targets)

当我尝试使用此Makefile进行编译时,例如,通过键入$ make rpn,我会收到以下输出,然后显示错误:

cc -g    rpn.s   -o rpn
/tmp/ccQab9W.o: In function `_start':

...

(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: rpn] Error 1

似乎Makefile默认为编译C文件的隐式规则,而不是我编译程序集文件的通用规则。我做错了什么?

1 个答案:

答案 0 :(得分:4)

你应该更换你的非终端匹配任何规则:

%: %.o
        $(LD) $< -o $@ $(LDFLAGS)

通过更具体的静态模式规则:

$(targets): %: %.o
        $(LD) $< -o $@ $(LDFLAGS)

静态模式规则优先于rpn.s -> rpn隐式规则,而非终端匹配任何规则则不优先。完整的解释在GNU make手册的Implicit Rule Search Algorithm section部分。准备好花一些时间......