我已经在stackoverflow和其他制作手册,网站上搜索了很长时间但却找不到任何尾随空格或错过make函数中的用法。你能帮我解决这个警告信息吗?
make: Circular main.asm.o <- main.asm dependency dropped.
生成文件:
AS:=yasm
CC:=gcc
OUTPUTDIR:=$(shell pwd)/bin
ASFLAGS:=-g dwarf2 -f elf64 -a x86
CFLAGS:=-g
SOURCES=$(wildcard *.asm)
OBJECTS=$(patsubst %.asm,%.o,$(SOURCES))
%.o: $(SOURCES)
$(AS) $(ASFLAGS) -o $(OUTPUTDIR)/$(OBJECTS) $<
all: $(OBJECTS)
$(CC) $(CFLAGS) -o httpd $(OUTPUTDIR)/$(OBJECTS)
clean:
rm $(OUTPUTDIR)/*
rm httpd
main.asm中:
section .text
global main
extern exit
main:
mov rdi, 1
call exit
谢谢你:)
答案 0 :(得分:11)
您的错误就在这一行:
%.o: $(SOURCES)
可能会扩展到像
这样的东西%.o: main.asm foo.asm bar.asm
这意味着非常接近
main.asm.o: main.asm
foo.asm.o: foo.asm
bar.asm.o: bar.asm
....
这是'大约',因为你在这里混淆了语法。
您将普通规则(target: source
)与通配符规则(%.target: %.source
)混淆。您可能想要的是
%.o: %.asm
$(AS) $(ASFLAGS) -o $@ $<
教授如何从.o
文件制作.asm
个文件,并结合
httpd: $(SOURCES:.asm=.o)
$(CC) $(CFLAGS) -o httpd $*
告诉Make如何将各种.o
文件合并到httpd
可执行文件中。 $(SOURCES:.asm=.o)
变量引用扩展为.o
文件列表作为依赖项,Make现在知道如何从相应的.o
文件创建这些.asm
文件。
答案 1 :(得分:1)
AS:=yasm
CC:=gcc
ASFLAGS:=-g dwarf2 -f elf64 -a x86
CFLAGS:=-g
OBJECTSDIR:=$(shell pwd)/bin
SRCDIR:=$(shell pwd)/src
SOURCES=$(wildcard $(SRCDIR)/*.asm)
OBJECTS=$(shell find $(OBJECTSDIR) -name *.o)
%.o: %.asm
$(AS) $(ASFLAGS) -o $(subst $(SRCDIR),$(OBJECTSDIR),$@) $<
httpd: $(SOURCES:.asm=.o)
$(CC) $(CFLAGS) -o httpd $(OBJECTS)
clean:
rm -f $(OBJECTSDIR)/*
rm -f httpd
感谢你解释诺曼,我做到了。拥有不同的文件夹,/ bin和/ src对我来说非常重要,这样一切都能保持清晰。
谢谢你,它正在工作,我理解我的错误。
注意:如果我将任何目标文件放在Makefile文件夹中,我会发出奇怪的错误...只需删除它们就可以使它再次运行。