簡體   English   中英

make:循環依賴被刪除

[英]make: Circular dependency dropped

我已經在 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 現在知道如何從相應的.asm文件創建這些.o文件。

額外觀察:

  1. 如果它不明顯, $(SOURCES:.asm=.o)所做的是擴展到$(SOURCES)的值,但將尾隨的.asm替換為.o
  2. 我個人會用這個 Makefile 做的是用一個明確的文件列表替換SOURCES定義中的wildcard 這樣,例如,如果將my-temp-test.asm文件添加到目錄中,就不會得到意外結果。 (這屬於“我如何對未來的我好?”的標題)
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 中得到奇怪的錯誤......只需刪除它們即可使其再次工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM