>Java >java지도 시간 >Makefile의 빌드 규칙을 구문 분석합니다.

Makefile의 빌드 규칙을 구문 분석합니다.

高洛峰
高洛峰원래의
2016-11-22 14:24:511674검색

메이크파일은 유형, 기능 및 모듈에 따라 여러 디렉터리에 배치된 프로젝트의 수많은 소스 파일을 편집합니다. 메이크파일은 어떤 파일을 먼저 컴파일하고 심지어 업데이트해야 하는지 지정하는 일련의 규칙을 정의합니다. , makefile은 운영 체제 명령도 실행할 수 있는 셸 스크립트와 비슷하기 때문입니다.

완성될 Makefile은 전체 프로젝트의 컴파일, 연결 및 기타 규칙을 설명합니다. 여기에는 프로젝트의 어떤 소스 파일을 컴파일해야 하는지, 어떻게 컴파일해야 하는지, 어떤 라이브러리 파일을 생성해야 하는지, 이러한 라이브러리 파일을 어떻게 생성하는지, 최종적으로 원하는 실행 파일을 생성하는 방법이 포함됩니다. 복잡한 문제처럼 보일 수도 있지만, 프로젝트용 Makefile 작성의 이점은 하나(일반적으로 프로젝트의 경우 여러 개)의 올바른 Makefile이 제공되면 한 줄 명령을 사용하여 "자동 컴파일"을 완료할 수 있다는 것입니다. 전체 프로젝트를 컴파일하기 위해 해야 할 유일한 일은 쉘 프롬프트에서 make 명령을 입력하는 것입니다. 전체 프로젝트가 완전히 자동으로 컴파일되어 효율성이 크게 향상됩니다.

make는 Makefile의 명령(규칙이라고 해야 함)을 해석하는 명령 도구입니다. Makefile은 전체 프로젝트에 있는 모든 파일의 컴파일 순서와 컴파일 규칙을 설명합니다. Makefile에는 자체 작성 형식, 키워드 및 기능이 있습니다. C 언어와 마찬가지로 고유한 형식, 키워드 및 기능이 있습니다. 그리고 Makefile에서는 시스템 셸에서 제공하는 모든 명령을 사용하여 원하는 작업을 완료할 수 있습니다. Makefile(다른 시스템에서는 다른 파일 이름일 수 있음)은 대부분의 IDE 개발 환경에서 사용되며 프로젝트 컴파일 방법이 되었습니다.

makefile의 장점은 - "자동 컴파일"입니다. 일단 작성되면 make 명령 하나만 필요하며 전체 프로젝트가 완전히 자동으로 컴파일되므로 소프트웨어 개발 효율성이 크게 향상됩니다. make는 makefile의 명령을 해석하는 명령 도구입니다. 일반적으로 Delphi의 make, Visual C++의 nmake 및 Linux의 GNU make와 같은 대부분의 IDE에는 이 명령이 있습니다. makefile이 엔지니어링 분야의 컴파일 방법이 되었음을 알 수 있습니다.

Make 도구의 주요이자 가장 기본적인 기능은 Makefile 파일을 통해 소스 프로그램 간의 관계를 기술하고 컴파일 작업을 자동으로 유지 관리하는 것입니다. makefile 파일은 특정 구문에 따라 작성되어야 하며, 각 소스 파일을 컴파일하고 연결하여 실행 파일을 생성하는 방법을 설명해야 하며, 소스 파일 간의 종속성을 정의해야 합니다. 메이크파일 파일은 Windows NT를 포함한 많은 컴파일러에서 컴파일 정보를 유지하는 일반적인 방법입니다. 통합 개발 환경에서 사용자는 친숙한 인터페이스를 통해서만 메이크파일 파일을 수정합니다. UNIX 시스템에서는 Makefile을 makefile 파일로 사용하는 것이 일반적입니다. 다른 파일을 makefile로 사용하려면 다음과 유사한 make 명령 옵션을 사용하여 makefile 파일을 지정하면 됩니다.

$ make -f Makefile.debug _예를 들어 prog라는 프로그램은 세 개의 C로 구성됩니다. 소스 파일 filea .c, fileb.c 및 filec.c와 라이브러리 파일 LS가 컴파일되고 생성됩니다. 이 세 파일에는 각각 자체 헤더 파일 a.h, b.h 및 c.h도 포함되어 있습니다. 일반적으로 C 컴파일러는 세 개의 개체 파일 filea.o, fileb.o 및 filec.o를 출력합니다. filea.c와 fileb.c는 모두 defs라는 파일의 사용을 선언하지만 filec.c는 그렇지 않다고 가정합니다. 즉, filea.c 및 fileb.c에는 다음과 같은 명령문이 있습니다.

include "defs"

다음 문서에서는 이러한 파일 간의 상호 연결을 설명합니다.

0 #makefile 주석줄 설명 예시입니다

1 prog : filea.o fileb.o filec.o # prog 지정은 filea.o, fileb.o, filec 세 개의 대상 파일로 구성됩니다. o 링크 생성

2 cc filea.o fileb.o filec.o -LS -o prog # prog 파일에서 실행 파일을 만드는 방법은

3 filea.o : filea에 따라 다릅니다. #filea.o 대상 파일과 이들이 종속된 .c 및 .h 파일과 defs 파일을 지정합니다.

4 cc -c filea.c # 대상이 종속된 파일에서 대상을 빌드하는 방법 on, 그것은 filea.c에서 filea.o를 빌드하는 방법입니다

5 fileb.o : fileb.c b.h defs # fileb.o 대상 파일과 .c 및 .h 파일을 지정하고 defs 파일이 의존하는 파일

6 cc -c fileb.c #타겟이 의존하는 파일에서 타겟을 생성하는 방법, 즉 fileb.c에서 fileb.o를 생성하는 방법

7 filec.o : filec.c c.h # filec를 지정합니다. oTarget 파일과 해당 파일이 의존하는 .c 및 .h 파일

8 cc -c filec.c #에서 대상을 빌드하는 방법 대상이 의존하는 파일, 즉 filec.c에서 filec.o를 빌드하는 방법

이 설명 문서는 깊이 우선 원칙을 사용하여 컴파일 명령을 실행하는 간단한 makefile입니다. 위 예제의 코드에 대해 몇 가지 기본적인 설명을 해보겠습니다. CC는 Makefile에서 사용되는 컴파일러를 지정하는 전역 변수입니다. 일반적으로 기본값은 gcc입니다. .o 파일은 Unix와 마찬가지로 중간 코드 대상 파일입니다. Windows에서는 Unix의 .obj 파일과 마찬가지로 Unix에서 .o 파일을 생성하는 프로세스를 컴파일이라고 하며 실행 파일을 생성하기 위해 수많은 .o 파일을 수집하는 프로세스를 링크라고 하는 경우도 있습니다. Unix 인터페이스 파일, 즉 Windows의 라이브러리 파일에 해당하는 파일입니다. .a 파일의 기능은 다음과 같습니다. 소스 파일이 너무 많기 때문입니다(위 예에서는 .c 및 .h 파일이 너무 많습니다.) ), 컴파일로 생성된 중간 대상 파일(.o 파일이 너무 많습니다), 링크 시 중간 대상 파일의 이름을 명확하게 지적해야 하는데 이는 컴파일에 매우 불편하므로 패키징해야 합니다. 중간 대상 파일이며 이 패키지는 .a 파일입니다.

컴파일 후 filea.c 또는 a.h 파일이 수정되면 make 도구는 filea.o를 자동으로 다시 컴파일할 수 있습니다. 두 컴파일 사이에 filea.c와 a.h가 수정되지 않은 경우, 그리고 filea.o가 여전히 수정되지 않은 경우 존재하는 경우 다시 컴파일할 필요가 없습니다. 이 종속성은 여러 소스 파일이 포함된 프로그램 컴파일에서 특히 중요합니다. 이 종속성을 정의함으로써 make 도구는 불필요한 컴파일 작업을 많이 피할 수 있습니다. 물론 셸 스크립트를 사용하여 자동 컴파일을 수행할 수도 있습니다. 그러나 셸 스크립트는 다시 컴파일할 필요가 없는 소스 파일을 포함하여 모든 소스 파일을 컴파일하는 반면 make 도구는 대상이 마지막으로 컴파일된 시간을 기준으로 컴파일할 수 있습니다. 소스 파일의 업데이트 시간을 기준으로 어떤 소스 파일을 컴파일해야 하는지 자동으로 결정합니다. _

Makefile의 규칙을 대략적으로 살펴보겠습니다. [3] target ... : 전제조건 ... 명령 ... ... 대상 : 종속성 실행 명령 ... 대상은 대상 파일이며 개체 파일 또는 실행 파일일 수 있습니다. 라벨일 수도 있습니다. ① 전제 조건은 해당 대상을 생성하는 데 필요한 파일 또는 대상입니다. ② 명령은 make가 실행해야 하는 명령입니다. (모든 셸 명령) 이는 파일 종속성입니다. 즉, 대상의 하나 이상의 대상 파일이 전제 조건의 파일에 종속되고 해당 생성 규칙이 명령에 정의됩니다. 직설적으로 말하면, 전제 조건에 대상 파일보다 새로운 파일이 두 개 이상 있으면 command에 정의된 명령이 실행됩니다(명령은 Tab 키로 시작해야 합니다. 그렇지 않으면 컴파일러가 명령을 인식하지 못합니다). 반복적인 컴파일로 소프트웨어 엔지니어링 관리 효율성이 향상되었습니다.

Makefile을 사용하면 간단한 매크로를 사용하여 소스 파일 및 관련 컴파일 정보를 참조할 수 있습니다. 매크로는 Linux에서 변수라고도 합니다. 매크로를 인용할 때는 변수 앞에 $ 기호만 추가하면 되지만, 변수 이름이 한 글자보다 길 경우 인용할 때 괄호()를 추가해야 한다는 점에 유의할 필요가 있습니다. 유효한 매크로 참조는 $(CFLAGS) $Z $(Z)입니다. 여기서 마지막 두 참조는 동일합니다. Unix 시스템에서는 $*, $@, $? 및 $< 변수는 에 정의되어 있습니다. 미리 정의된 변수의 세부 사항과 관련하여 매크로 정의를 사용하면 지루한 컴파일 옵션에서 벗어나 makefile 작성에 큰 편리함을 가져올 수 있습니다.

GNU의 주요 사전 정의 변수 make 사전 정의 변수 의미 $* 확장자가 없는 대상 파일의 이름입니다. $+ 나타나는 순서대로 공백으로 구분된 모든 종속 파일에는 중복된 종속 파일이 포함될 수 있습니다. $< 첫 번째 종속 파일의 이름입니다. $? 수정 날짜가 대상 생성 날짜보다 이후인 모든 종속 파일은 공백으로 구분됩니다. $@ 대상의 전체 이름입니다. $^ 공백으로 구분된 모든 종속 파일에는 중복된 종속 파일이 포함되지 않습니다. $% 대상이 아카이브 멤버인 경우 이 변수는 대상의 아카이브 멤버 이름을 나타냅니다. 예를 들어, 대상 이름이 (image.o)인 경우 $@는 image.o이고 $%는 image.o입니다. AR 아카이브 유지 관리 프로그램의 이름입니다. 기본값은 ar입니다. ARFLAGS 아카이브 유지 관리 프로그램에 대한 옵션입니다. AS 어셈블러의 이름, 기본값은 as입니다. ASFLAGS 어셈블러 옵션. CC C 컴파일러의 이름, 기본값은 cc입니다. CFLAGS C 컴파일러 옵션. CPP C 사전 컴파일러의 이름, 기본값은 $(CC) -E입니다. CPPFLAGS C 사전 컴파일 옵션. CXX C++ 컴파일러 이름, 기본값은 g++입니다. CXXFLAGS C++ 컴파일러 옵션. FC FORTRAN 컴파일러의 이름입니다. 기본값은 f77입니다. FFLAGS FORTRAN 컴파일러 옵션. Makefile은 콜론 오른쪽에 있는 파일을 파일 이름: 파일 이름 형식으로 비교하여 왼쪽 파일보다 최신인지 확인하고 업데이트되면 프로그램 코드의 다음 줄을 실행합니다. 따라서 Makefile은 파일을 연결할 수 있습니다


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.