[英]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
文件。
額外觀察:
$(SOURCES:.asm=.o)
所做的是擴展到$(SOURCES)
的值,但將尾隨的.asm
替換為.o
。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.