2014-01-28 102 views
0

我試圖用匯編語言組裝一個由兩個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)確實有效,但如果我有很多文件需要編譯,編寫和讀取可能有點繁瑣。布倫丹:謝謝你,我用你的方式搜索了一下,這很有趣。我會嘗試 –

回答

1

像這樣的規則應該做的伎倆:

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

[email protected]$<將分別擴大到目標和(第一,並在我們的情況下,只有)輸入文件的名稱。

+0

謝謝@Michael這個規則正在做我想要的!我仍然不明白爲什麼使用變量$(SRCS)和$(OBJS)不起作用 –

+0

如果解決了問題,您應該點擊旁邊的複選標記標記答案爲正確。 – MadScientist

+1

它不起作用的原因是因爲這就是'nasm'程序被定義爲行爲的方式:它將單個源文件作爲輸入,並將單個對象文件寫爲輸出。所以當你用多個輸入文件和多個輸出文件調用它時,它會失敗。這與'make'無關。可能有一些程序在一個命令行上有多個輸入和輸出,並且這些程序可以工作。但那不是'nasm'的工作原理。 – MadScientist