我已经在 stackoverflow 和其他 make 手册、网站上搜索了很长时间,但找不到任何尾随空格或错过 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
谢谢你:)
最佳答案
您的错误是这一行:
%.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 $@ $<
它教Make如何从.asm
文件创建.o
文件,并结合
httpd: $(SOURCES:.asm=.o)
$(CC) $(CFLAGS) -o httpd $*
它告诉 Make 如何将各种 .o
文件组合到 httpd
可执行文件中。 $(SOURCES:.asm=.o)
变量引用扩展为 .o
文件列表作为依赖项,Make 现在知道如何创建这些 。 o
文件来自相应的 .asm
文件。
额外观察:
- 如果不明显,
$(SOURCES:.asm=.o)
所做的就是扩展为$(SOURCES)
的值,但尾随.asm
替换为.o
。 - 我个人会对此 Makefile 执行的操作是用显式文件列表替换
SOURCES
定义中的通配符
。这样,如果您将my-temp-test.asm
文件添加到目录中,就不会得到意外结果。 (这属于“我怎样才能对 future 的我好?”的标题)
关于assembly - 使: Circular dependency dropped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904906/