9

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

主.asm:

section .text
  global main
  extern exit

main:
  mov rdi, 1
    call exit   

感谢您 :)

4

2 回答 2

13

你的错误是这一行:

%.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 如何.o.asm文件中制作文件,并结合

httpd: $(SOURCES:.asm=.o)
    $(CC) $(CFLAGS) -o httpd $*

它告诉 Make 如何将各种.o文件组合到httpd可执行文件中。$(SOURCES:.asm=.o)变量引用扩展为作为依赖项的文件列表,.oMake 现在知道如何.o从相应的文件创建这些.asm文件。

额外的观察:

  1. 如果不明显,$(SOURCES:.asm=.o)可以扩展为 的值$(SOURCES),但尾随.asm替换为.o.
  2. 个人对这个 Makefile 所做的是wildcard将定义中的替换SOURCES为明确的文件列表。这样,例如,如果您将my-temp-test.asm文件添加到目录中,您将不会得到意外的结果。(这属于“我怎样才能对未来的我好?”的标题下)
于 2014-07-23T19:32:43.067 回答
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 中得到奇怪的错误......只需删除它们就可以让它再次工作。

于 2014-07-23T08:58:25.057 回答