2014-07-23 2 views
0

나는 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 

덕분에 당신에게 :)

답변

6

귀하의 오류가이 라인 여기에서 구문을 뒤섞어 쓰고 있습니다.

일반 규칙 (target: source)과 와일드 카드 규칙 (%.target: %.source)을 혼동하는 것입니다. 당신이 아마 원하는 것은 httpd 실행에 다양한 .o 파일을 결합하는 방법을 확인 말한다

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

과 결합 .asm 파일에서 .o 파일을 만드는 방법을 확인 가르치는

%.o: %.asm 
    $(AS) $(ASFLAGS) -o [email protected] $< 

이다. $(SOURCES:.asm=.o) 변수 참조는 .o 개의 파일 목록을 종속 파일로 확장하고 Make는 해당 파일에서 해당 .o 파일을 만드는 방법을 알고 있습니다.

0
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),[email protected]) $< 

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


clean: 
    rm -f $(OBJECTSDIR)/* 
    rm -f httpd 

감사합니다 당신이 노먼을 해설에, 나는 그것을했다. 모든 것이 명확하게 유지되도록/bin 및/src라는 별개의 폴더를 갖는 것이 중요합니다.

고맙습니다. 작동하고 있으며 제 오류를 이해합니다.

참고 : 개체 파일을 Makefile 폴더에 넣으면 make에서 이상한 오류가 발생합니다. 삭제하면 파일이 삭제되어 다시 작동합니다. 아마도 그 때문에 '약'의 바로 그 약

main.asm.o: main.asm 
foo.asm.o: foo.asm 
bar.asm.o: bar.asm 
    .... 

같은 것을 의미 무엇

%.o: main.asm foo.asm bar.asm 

같은 것을로 확장

%.o: $(SOURCES) 

:

+0

그래서 'main.asm'이 아닌 다른 asm 파일이 실제로 필요하지 않습니까? – Beta

+0

물론 아니지만 grep -v는 반대 결과입니다. main.asm을 제외한 $ (SOURCE)에 모든 .asm 파일이 있음을 의미합니다. – Erol

+1

그리고 사용하지 마십시오. – Beta