编译两个asm文件时出现“nasm:错误:指定了多个输入文件”

问题描述:

我试图用汇编语言组装一个由两个asm文件组成的小型初学者程序。我可以制作一个单独的文件,但我想尝试调用另一个文件中的过程。
这里是我的Makefile:编译两个asm文件时出现“nasm:错误:指定了多个输入文件”

NAME  = formatter 

SRCS  = formatter.asm clearstring.asm 

OBJS  = $(SRCS:.asm=.o)` 

NASM  = nasm 
NASMFLAGS = -f elf64 -F dwarf 

LD  = ld 

RM  = rm -f 

all:  $(NAME) 

$(NAME): $(OBJS) 
    $(LD) $(OBJS) -o $(NAME) 

#(1): 
# formatter.o: formatter.asm 
# $(NASM) -o formatter.o formatter.asm $(NASMFLAGS) 
# clearstring.o: clearstring.asm 
# $(NASM) -o clearstring.o clearstring.asm $(NASMFLAGS) 

#(2): 
$(OBJS): $(SRCS) 
    $(NASM) -o $(OBJS) $(SRCS) $(NASMFLAGS) 

当使用下注释代码(1),一切正常,但是当我用紧凑的代码(2),make给我说:

nasm -o formatter.o clearstring.o formatter.asm clearstring.asm -f elf64 -F dwarf 
nasm: error: more than one input file specified 
nasm: error: more than one input file specified 
type `nasm -h' for help 
make: *** [formatter.o] Error 1 

据我所知,组装步骤是不对的,但我不能让它这样做:

nasm -o formatter.o formatter.asm -f elf64 -F dwarf 
nasm -o clearstring.o clearstring.asm -f elf64 -F dwarf 

我希望我一直在为我的第一个阙不够清晰在这个网站上。
你能帮我吗?

+1

我不明白这个问题。您已注释为(1)的方法是执行此操作的正确方法。你说当你使用它时一切正常。那么使用它有什么问题? – MadScientist

+0

替代方法是将一个程序集文件另存为“%include”。例如,对于纯装配,我通常只有一个包含所有内容的“0index.asm”文件,因此我不必费心使用make(并检查文件是否更改,并启动Nasm进程N次,并链接,...)。它更快更容易忘记所有这些...... :-) – Brendan

+0

@MadScientist:方法(1)确实有效,但如果我有很多文件需要编译,编写和读取可能有点繁琐。布伦丹:谢谢你,我用你的方式搜索了一下,这很有趣。我会尝试 –

像这样的规则应该做的伎俩:

%.o: %.asm 
    $(NASM) $(NASMFLAGS) -o [email protected] $< 

[email protected]$<将分别扩大到目标和(第一,并在我们的情况下,只有)输入文件的名称。

+0

谢谢@Michael这个规则正在做我想要的!我仍然不明白为什么使用变量$(SRCS)和$(OBJS)不起作用 –

+0

如果解决了问题,您应该点击旁边的复选标记标记答案为正确。 – MadScientist

+1

它不起作用的原因是因为这就是'nasm'程序被定义为行为的方式:它将单个源文件作为输入,并将单个对象文件写为输出。所以当你用多个输入文件和多个输出文件调用它时,它会失败。这与'make'无关。可能有一些程序在一个命令行上有多个输入和输出,并且这些程序可以工作。但那不是'nasm'的工作原理。 – MadScientist