2012-11-30 4 views
1

그래서 아래에 설명 된 응용 프로그램을 생성하는 메이크 파일을 만들고 각 생성 된 파일에 자체 규칙이 있는지 확인해야합니다.메이크 파일 만들기

메이크 파일 : 첫 번째 도구는 flex이며 spec.l이라는 파일을 사용하고 lex.yy.c이라는 파일을 생성합니다. bison이라는 또 다른 도구는 calledspec.y 파일을 필요로하고 spec.tab.c 파일을 생성합니다. bison이 지시문 -vd을 사용하여 호출되면 spec.tab.h이라는 파일을 생성합니다 (lex.yy.c를 컴파일 할 때 필요함). 두 개의 C 파일을 오브젝트 파일로 컴파일 한 다음 yacc (-ly) 및 lex (-ll) 라이브러리와 함께 링크하여 컴파일러를 생성 할 수 있습니다 (a.out. 설명하는 메이크 파일은 시작하기 만하면 다음 명령을 생성해야합니다. spec.l 및 spec.y로 :

flex spec.l 
bison -vd spec.y 
gcc -c lex.yy.c 
gcc -c spec.tab.c 
gcc spec.tab.o lex.yy.o -ly -ll 

내가 어디에서이 문제를

편집을 시작할 확실하지 않다 : 난 당신이 메이크업에게 지금까지

compiler: spec.tab.o lex.yy.o 
gcc spec.tab.o lex.yy.o -ly –ll 
lex.yy.c: spec.l 
flex spec.l 
spec.tab.c: spec.y 
bison -vd spec.y 
spec.tab.o: spec.tab.c 
gcc -c spec.tab.c 
lex.yy.o: lex.yy.c spec.tab.h 
gcc –c lex.yy.c 
clean: 
rm –f *.c *.o a.out 
+0

그러면 문제는 무엇입니까? 너 여기서 뭘 이해하지? 기본 규칙에 대해 알고 있습니까? 거기에서 계속할 수 있습니까? – dmckee

+0

당신이 이미 그것을 발견하지 못했다면 여기에 [링크] (http : // oreilly.co.kr/catalog/make3/book /)에서 시작합니다. 1-3 장을 빨리 읽으십시오. – dinesh

+0

명확하지 않은 경우 : 종속성과 관련된 명령을 들여 쓸 필요가 있으며 명령과 다음 종속성 사이에 빈 줄을 남겨 둘 필요가 있습니다 (그렇지 않으면 두 개 또는 종속성을 위해 더 많은 명령 실행). –

답변

2

이 무엇을 의존성에 대해. 시험 PLE, lex.yy.c는 spec.l에 따라 달라집니다

lex.yy.c: spec.l 
    flex spec.l 

첫 번째 줄은 lex.yy.cspec.l에 따라 달라 말한다. 두 번째는 spec.l이 더 새로운 경우 lex.yy.c의 업데이트 된 버전을 생성하는 방법을 알려줍니다. 우리는 다른 파일들과 거의 비슷한 패턴을 반복합니다. calledspec.y의 경우 동일한 입력/명령으로 생성 된 두 개의 결과가 있습니다. 적어도 GNU와이 같은 것을 지정할 수 있도록 :

헤더에 .o (또는 .obj 등) 파일의 종속성 및 C 파일에 대한 과정을 반복
spec.tab.c spec.tab.h: calledspec.y 
    bison -vd calledspec.y 

그런 다음 거의 :

lex.yy.o: lex.yy.c spec.tab.h 
    $(cc) -c lex.yy.c 

마지막으로 참고 : 그 후 메이크 파일에 지정된 목표를 구축 할 것입니다 수 있도록, 달리 지정, 그래서 당신은 일반적으로 먼저 최종 실행 파일을 준비 할, 그리고 다른 목표되지 아니하는

,
parser: lex.yy.o y.tab.o 
    $(cc) -o parser lex.yy.o y.tab.o 

lex.yy.o: lex.yy.c spec.tab.h 
    $(cc) -c lex.yy.c 

등등. 메이크 파일의 시작 부분에 ...

cflags = -O2 

: 당신은 일반적으로 같은 몇 가지를 볼 수 있도록이 만하지 매크로에 불구하고 대상에 적용됩니다. 그런 다음 선이 컴파일러를 이용합니다 호출, 뭔가 같은 :

lex.yy.o: lex.yy.c spec.tab.h 
    $(cc) $(cflags) -c lex.yy.c 

그리고이 실행되면, cflags 매크로가 확장됩니다, 그래서 실행됩니다 명령이 gcc -O2 -c lex.yy.c (그리고 그것은 이름으로 cc을 미리 정의 컴파일러가 일반적으로 사용하기를 기대하므로 컴파일러는 cl, GNU는 gcc 등으로 설정합니다.