make:循环依赖关系丢失

时间:2014-07-23 08:01:13

标签: assembly makefile yasm

我已经在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   

谢谢你:)

2 个答案:

答案 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文件夹中,我会发出奇怪的错误...只需删除它们就可以使它再次运行。