我正在尝试编写一个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
输出 - 注意:输出的字符数太多,因此是pastebinned
答案 0 :(得分: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
此答案标记为社区维基。任何感激都应该转到Jonathan Leffler。