저는 명령줄을 사용하여 플렉스와 (실제로 처음으로) 배우고 있습니다.
테스트 프로세스를 단순화하기 위해 Makefile을 만들었지만 명령이 왜 반대인지 이해가 되지 않습니다.
예를 들어 터미널의 순서는 다음과 같습니다.
flex test.l
그러면 파일이 생성됩니다.lex.yy.c
그런 다음 다음을 컴파일합니다.
g++ lex.yy.c -ll -o test
Makefile은 거꾸로 읽습니다:
test: lex.yy.c
g++ lex.yy.c -ll -o test
lex.yy.c: test.l
flex test.l
그렇다면 내가 달릴 때 정확히 무슨 일이 일어나는가 make
?
답변1
Makefile은 다음 형식을 따릅니다. (전부는 아니지만 대부분의 구현에서 요구하기 때문에 Makefile은 항상 공백 대신 탭을 사용해야 합니다 make
.)
target: dependencies
operations to build target
- 타겟은 빌드/컴파일/생성하려는 대상입니다. 여러 개가 있을 수 있으며 종속성을 먼저 충족해야 하는 경우가 아니면 Makefile 순서로 빌드해야 합니다. 이것첫 번째파일의 대상이 호출됩니다.기본 대상,
make
인수 없이 호출할 때 빌드하려고 하는 것입니다. - 종속성은 대상을 빌드하는 데 필요한 다양한 부분입니다.
이 Makefile에는 두 가지 목표가 있습니다.
- 시험
- lex.yy.c
lex.yy.c
빌드에 필요한 종속성이므로 처음 test
부터 빌드됩니다 test.l
. 생성되면 컴파일할 준비가 된 것입니다 test
. 기본적으로 make
... :
- 구축해 보세요
test
. - 해결되지 않은 종속성.
lex.yy.c
존재하지 않거나 업데이트되었으므로 먼저 빌드해야 합니다. - 빌드할 작업을 읽습니다
lex.yy.c
. 실행flex test.l
:lex.yy.c
구축되었습니다. test
모든 종속성이 충족됩니다. 달리기g++ lex.yy.c -ll -o test
.test
건설되다.
추가 정보:makefile에 대한 더 많은 정보를 원하시면 제가 추천합니다리눅스 개발 플랫폼통과라피크 울 레만.4장: GNU Make 사용하기.
답변2
먼저 호출을 target 으로 만드세요 test
. 그러나 lex.yy.c
이는 종속성입니다.
따라서 실제로 실행하기 전에 대상과 모든 종속성을 분석하십시오. 첫 번째 대상은 이지만 test
실행을 시작하기 전에 lex.yy.c
호출됩니다 .