我创建了以下简单的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] 删除。
我来说两句