2012-09-29 121 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

相关问题