0

我正在尝试编写一个 Makefile,它将其目标和对象分别复制到 bin/ 和 obj/ 目录。

然而,当我尝试运行它时,我收到以下错误:

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

在 Makefile 源下方发布-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输出 - 注意:输出的正文字符太多,因此被粘贴

http://pastebin.com/3bctGJxs

4

1 回答 1

1

Jonathan Leffler在评论中所说的是正确的。您的$(OBJDIR)/%.o: $(SRC)规则将您的源代码编译成一个目标文件,但您没有告诉nasm在哪里保存该目标文件。这准确解释了为什么您会收到有关链接obj/main.o器未找到的链接错误 - 因为nasm不知道它应该将其保存在obj/main.o. 尝试添加-o <output>,例如:

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

这个答案被标记为community wiki。任何感谢都应该归功于 Jonathan Leffler

于 2012-09-29T03:25:07.903 回答