编译两个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
我希望我一直在为我的第一个阙不够清晰在这个网站上。
你能帮我吗?
像这样的规则应该做的伎俩:
%.o: %.asm
$(NASM) $(NASMFLAGS) -o [email protected] $<
[email protected]
和$<
将分别扩大到目标和(第一,并在我们的情况下,只有)输入文件的名称。
谢谢@Michael这个规则正在做我想要的!我仍然不明白为什么使用变量$(SRCS)和$(OBJS)不起作用 –
如果解决了问题,您应该点击旁边的复选标记标记答案为正确。 – MadScientist
它不起作用的原因是因为这就是'nasm'程序被定义为行为的方式:它将单个源文件作为输入,并将单个对象文件写为输出。所以当你用多个输入文件和多个输出文件调用它时,它会失败。这与'make'无关。可能有一些程序在一个命令行上有多个输入和输出,并且这些程序可以工作。但那不是'nasm'的工作原理。 – MadScientist
我不明白这个问题。您已注释为(1)的方法是执行此操作的正确方法。你说当你使用它时一切正常。那么使用它有什么问题? – MadScientist
替代方法是将一个程序集文件另存为“%include”。例如,对于纯装配,我通常只有一个包含所有内容的“0index.asm”文件,因此我不必费心使用make(并检查文件是否更改,并启动Nasm进程N次,并链接,...)。它更快更容易忘记所有这些...... :-) – Brendan
@MadScientist:方法(1)确实有效,但如果我有很多文件需要编译,编写和读取可能有点繁琐。布伦丹:谢谢你,我用你的方式搜索了一下,这很有趣。我会尝试 –