Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 程序集的Makefile使用隐式规则而不是显式规则_Assembly_Makefile - Fatal编程技术网

Assembly 程序集的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)

我创建了以下简单的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)

.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)