我创建了以下简单的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文件的隐式规则,而不是我编译程序集文件的通用规则。我做错了什么?
答案 0 :(得分:4)
你应该更换你的非终端匹配任何规则:
%: %.o
$(LD) $< -o $@ $(LDFLAGS)
通过更具体的静态模式规则:
$(targets): %: %.o
$(LD) $< -o $@ $(LDFLAGS)
静态模式规则优先于rpn.s -> rpn
隐式规则,而非终端匹配任何规则则不优先。完整的解释在GNU make手册的Implicit Rule Search Algorithm section部分。准备好花一些时间......