汇编的Makefile使用隐式规则而不是显式规则

布吉3D

我创建了以下简单的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文件的隐式规则,而不是用于编译Assembly文件的通用规则。我究竟做错了什么?

雷诺·帕卡莱特

您可能应该替换非终结匹配规则:

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

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

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

静态模式规则优先于rpn.s -> rpn隐式规则,而非终结符任何规则都不优先完整的解释在GNU make手册的“隐式规则搜索算法”部分中。准备花一些时间...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章