Assembly 程序集的Makefile使用隐式规则而不是显式规则
我创建了以下简单的Makefile,用Assembly 程序集的Makefile使用隐式规则而不是显式规则,assembly,makefile,Assembly,Makefile,我创建了以下简单的Makefile,用as将.s文件编译成.o文件,然后用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)
as
将.s
文件编译成.o
文件,然后用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)
(.text+0x20):对“main”的未定义引用
collect2:错误:ld返回了1个退出状态
make:**[:rpn]错误1
似乎Makefile默认为编译C文件的隐式规则,而不是编译程序集文件的常规规则。我做错了什么?您可能应该替换非终端匹配规则:
%: %.o
$(LD) $< -o $@ $(LDFLAGS)
%:%
$(LD)$<-o$@$(LDFLAGS)
通过更具体的静态模式规则:
$(targets): %: %.o
$(LD) $< -o $@ $(LDFLAGS)
$(目标):%:%
$(LD)$<-o$@$(LDFLAGS)
静态模式规则优先于
rpn.s->rpn
隐式规则,而非终端匹配规则不优先。完整的解释在GNU make手册的一节中。准备花点时间在上面…makefile名为makefile
?您使用的是什么make
实现?makefile是否位于正确的目录中?看起来它使用内置规则直接从.s
转到可执行文件。我想你需要禁用它,如果你不想要它,检查Makefile
手册页/文档。与你的问题无关,但是所有的都应该是。也是假的吗?你能试试make-drpn
或者至少make--debug=irpn
?也许你可以收集一些有趣的信息,在这里发布(IIRC,完整的输出将是巨大的)。我的man make
中有一些更有趣的选项:-r,--no-builtin rules
消除了内置隐式规则的使用/-p,--print database
打印通过使用-r
选项读取makefiles/@Ped7g生成的数据库(规则和变量值),但是@RenaudPacalet有我正在寻找的解决方案。
%: %.o
$(LD) $< -o $@ $(LDFLAGS)
$(targets): %: %.o
$(LD) $< -o $@ $(LDFLAGS)