【问题标题】:make: Circular dependency droppedmake:循环依赖被丢弃
【发布时间】:2014-09-14 07:23:48
【问题描述】:

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

谢谢你:)

【问题讨论】:

    标签: assembly makefile yasm


    【解决方案1】:

    你的错误是这一行:

    %.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 现在知道如何从相应的 .asm 文件创建这些 .o 文件。

    额外观察:

    1. 在不明显的情况下,$(SOURCES:.asm=.o) 所做的是将$(SOURCES) 的值扩展为.asm 的尾随替换为.o
    2. 我个人会用这个 Makefile 做的是用一个明确的文件列表替换 SOURCES 定义中的 wildcard。这样,例如,如果您将my-temp-test.asm 文件添加到目录中,您将不会得到意外的结果。 (这属于“我怎样才能对未来的我好?”)

    【讨论】:

      【解决方案2】:
      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 文件夹中,我会从 make 中得到奇怪的错误...只需删除它们就可以让它再次工作。

      【讨论】:

      • 所以你实际上不需要main.asm以外的任何asm文件?
      • 当然不是,但是 grep -v 是相反的结果,这意味着我在 $(SOURCE) 中拥有除 main.asm 之外的所有 .asm 文件
      • 你不用它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多