2012-09-29 143 views
0

我正在嘗試編寫一個Makefile,它將其目標和對象分別複製到bin /和obj /目錄中。Makefile不會將.o複製到obj /並將目標複製到bin /文件夾

然而,當我嘗試運行它,我得到以下錯誤:

nasm -f elf64 -g -F stabs main.asm -l spacelander.lst 
ld -o spacelander obj/main.o 
ld: cannot find obj/main.o: No such file or directory 
make: *** [spacelander] Error 1 
Why is this happening? 

更新

當我張貼的錯誤,這是由於白色間隔的錯誤我注意到了。在照顧好這些人後,我仍然得到了新的錯誤,我用我之前提到的舊錯誤取而代之。

這是什麼?

更新2

發佈-d標誌輸出下面生成文件源。


來源

ASM := nasm 
ARGS := -f 
FMT := elf64 
OPT := -g -F stabs 

SRC := main.asm 

OBJDIR := obj 
TARGETDIR := bin 

OBJ := $(addprefix $(OBJDIR)/,$(patsubst %.asm, %.o, $(wildcard *.asm))) 
TARGET := spacelander 

.PHONY: all clean 

all: $(OBJDIR) $(TARGET) 

$(OBJDIR): 
    mkdir $(OBJDIR) 

$(OBJDIR)/%.o: $(SRC) 
    $(ASM) $(ARGS) $(FMT) $(OPT) $(SRC) -l $(TARGET).lst 

$(TARGET): $(OBJ) 
    ld -o $(TARGET) $(OBJ) 

clean: 
    @rm -f $(TARGET) $(wildcard *.o) 
    @rm -rf $(OBJDIR) 

make -d輸出 - 注:輸出身體太多的字符,因而pastebinned

http://pastebin.com/3bctGJxs

+0

哪條線是29和32?用-d給出什麼值得注意? – Scooter

+1

您可能需要指定'nasm'的輸出文件,也許使用'-o $ @'作爲附加選項(但您必須仔細閱讀手冊)。這與編譯器如'gcc'使用的'-o output.o'類似。 –

+0

在'$(TARGET):$(OBJ)'指令中,你的意思是? – zeboidlund

回答

1

的評論說什麼Jonathan Leffler是正確。你的$(OBJDIR)/%.o: $(SRC)規則將你的源代碼編譯成一個目標文件,但是你不告訴nasm保存那個目標文件的位置。這就解釋了爲什麼你的鏈接器沒有找到關於obj/main.o的鏈接錯誤 - 因爲nasm不知道應該將它保存在obj/main.o中。嘗試添加-o <output>,e.g:

$(OBJDIR)/%.o: $(SRC) 
    $(ASM) $(ARGS) $(FMT) -o [email protected] $(OPT) $(SRC) -l $(TARGET).lst 

這個答案被標記爲社區維基。任何的祝福都應該去Jonathan Leffler

相關問題