2013-04-06 2 views
0

나는 자동 변수 ([email protected],$^) 및 패턴 (%)를 사용하여 다음과 같은 makefile을 작성하지만, GNU 메이크 작동하지 않을 수 있습니다왜이 makefile을 사용할 수 없습니까?

TARGET = edit 
SRCS = $(wildcard *.c) 
OBJS = $(SRCS:%.c=%.o) 
$(TARGET) : $(OBJS) 
    gcc $^ -o $(TARGET) 
%.o : %.c 
    gcc $< -c [email protected] 

나는 작업 디렉토리에 foo.c를, bar.c 있습니다. 오류 :

gcc foo.c -c foo.o 
gcc: foo.o: No such file or directory 
make: *** [foo.o] Error 1 

나는 automatic variablespattern rules, 정확히 어떻게 그들을 사용하기에 매우 혼란스러워? 그리고 그들은 어떤 관계가 있습니까?

답변

1

규칙이 잘못되었습니다. 다음과 같아야합니다.

%.o : %.c 
    gcc -c $< -o [email protected] 
+0

감사합니다. 나는 너무 부주의했습니다! 그러나'gcc -c $^-o $ @'를'gcc -c $ <-o $ @'로 대체 할 때 왜 차이점을 볼 수 없습니까? –

+0

응답 내용을 잘 모르겠습니다. 여전히 오류가 표시됩니까? 새 오류 출력으로 질문을 업데이트 할 수 있습니까? 어떤 차이가 있습니까? – jszakmeister

+0

나는 당신이 말한 것을 뒤죽박죽이라고 생각합니다. 나는 당신이 "gcc -c $ <-o $ @'를'gcc -c $^-o $ @'로 대체 할 때 차이점을 보지 않는 이유가 무엇이라고 생각하십니까?" 따라서 첫 번째 종속성을 살펴 보는 대신 모든 것을 살펴보십시오. 대답은'.o' 파일마다 오직 하나의 의존성이 있다는 것입니다 : 그것은'.c' 파일입니다. 이 경우'$ ^'와'$ <'사이에는 차이가 없습니다. – jszakmeister

0

전문가가 아닌 경우 이러한 모든 sigils가 포함 된 전통 makefile 구문이 사용됩니다. 귀하의 질문에 관해서는

%.o : %.c 
    gcc -c $(input) -o $(ouptut) 

: makepp에서 당신은 자신이 긴 이름을 설명하는 (그리고 제 2 라인은 탭으로 시작 할 필요가 없습니다) 사용할 수있는 모든 규칙이 중복을 피하기 위해에 이러한 변수가 유용하지만, 그들은 패턴 규칙에 필수적입니다. 현재 여러 개의 입력 파일 중 어느 것이 현재 컴파일되고 있는지 알 수 있습니까?

makepp에는 훨씬 더 많은 것이 있습니다. GNU make가 할 수있는 거의 모든 것들을 수행하는 것 외에도, 훨씬 유용한 것들이 많이 있으며, 펄 파일을 사용하여 makefile을 확장 할 수도 있습니다.