【问题标题】:"nasm: error: more than one input file specified" when compiling two asm files编译两个 asm 文件时出现“nasm:错误:指定了多个输入文件”
【发布时间】:2014-01-28 14:46:48
【问题描述】:

我正在尝试用汇编语言组装一个包含两个 asm 文件的小型初学者程序。我可以创建一个文件,但我想尝试调用另一个文件中的过程。
这是我的 Makefile :

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)

使用 cmets (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) 的方法是正确的方法。您说使用时一切正常。那么使用它有什么问题呢?
  • 另一种方法是将一个程序集文件%include 另一个。例如,对于纯汇编,我通常只有一个包含所有内容的“0index.asm”文件,因此我不需要费心制作(并检查文件是否更改,启动 Nasm 进程 N 次,并链接, 和..)。忘记这一切会更快更容易... :-)
  • @MadScientist : 方法 (1) 确实有效,但如果我有多个文件要编译,那么编写和阅读可能会有点乏味。 Brendan:谢谢你,我用谷歌搜索了一下你的做法,这很有趣。我会试试的
  • 啊哈!好吧,这不是你问的问题。如果您问“我如何避免为每个源文件一遍又一遍地重写相同的规则?”那么我们会给你一个像下面迈克尔这样的答案,这是正确的方法。
  • Brendan:这可行,但效率较低:每次更改任何asm 文件时,都必须重新组装所有asm 文件。当然组装速度很快,所以可能不太明显。对于少量的asm 文件,它甚至可能更快。但项目越大,你就越能感受到它。

标签: linux assembly makefile nasm


【解决方案1】:

这样的规则应该可以解决问题:

%.o: %.asm
    $(NASM) $(NASMFLAGS) -o $@ $<

$@$&lt; 将分别扩展为目标和(在我们的例子中也是唯一的)输入文件的名称。

【讨论】:

  • 谢谢@Michael,这条规则正是我想要的!我仍然不明白为什么使用变量 $(SRCS) 和 $(OBJS) 不起作用
  • 如果它解决了您的问题,您应该通过单击旁边的复选标记将答案标记为正确。
  • 它不起作用的原因是因为 nasm 程序的行为方式是这样定义的:它将单个源文件作为输入,并将单个目标文件作为输出。因此,当您使用多个输入文件和多个输出文件调用它时,它会失败。这与make 无关。可能有一些程序可以在一个命令行上接受多个输入和输出,并且这些程序可以工作。但这不是nasm 的工作方式。
  • @MadScientist,感谢您的清晰解释。下次我会尽力提出一个完全明确的问题;)
猜你喜欢
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2011-06-10
  • 2022-11-29
  • 2018-05-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多