[Linux] Linux 프로젝트 자동화 빌드 도구—make/Makefile

1. 메이크/메이크파일이란?

메이크파일

Windows에서 VS 및 VS Code와 같은 ide를 사용하여 C/C++ 프로그램을 작성하여 프로젝트를 구현한 후 이러한 ide는 이러한 프로그램에 대한 실행 파일을 처리하고 생성하는 데 도움이 됩니다.

하지만 리눅스에서는 이 프로젝트를 명령어로 직접 구현해야 하는 경우 프로젝트에 있는 소스 파일은 세지 않고 종류별, 기능별, 모듈별로 여러 디렉토리에 배치되어 있어 하나로 연결하는 것이 매우 불편하다. 하나씩 편리합니다.

그리고 Linux는 프로젝트 자동 컴파일 도구를 제공합니다. 이 도구 Makefile는 지정할 일련의 규칙을 정의하여 어떤 파일을 먼저 컴파일해야 하는지, 어떤 파일을 나중에 컴파일해야 하는지, 어떤 파일을 다시 컴파일해야 하는지, 심지어 더 복잡한 기능적 작업을 수행하는지 등을 정의합니다. Makefile이 작성되면 하나의 make 명령만 필요하고 전체 프로젝트가 완전히 자동으로 컴파일되므로 소프트웨어 개발의 효율성이 크게 향상됩니다.

따라서 Makefile을 작성할 수 있는지 여부는 대규모 프로젝트를 완료할 수 있는 능력이 있는지 여부를 측면에서 보여줍니다.

만들다

make는 makefile의 명령을 설명하는 명령 도구입니다. 일반적으로 대부분의 IDE에는 Delphi의 make, Visual C++의 nmake, Linux의 GNU make와 같은 명령이 있습니다. Makefile이 엔지니어링에서 컴파일 방법이 된 것을 볼 수 있습니다.

다음과 같이 Makefile을 사용하여 C언어 파일인 hello.c의 실행 파일을 생성합니다.C
여기에 이미지 설명 삽입
프로그래머의 개발 환경이 터미널을 통해 연결된 하나의 Linux일 때 Makefile은 복잡한 프로젝트를 빌드하는 데 거의 유일한 선택이며, 또한 프로젝트에 프로젝트가 있는지 여부 세계화의 분수령, 대체로 Linux를 배우려면 Makefile이 충분히 중요합니다.

요약하다:

Linux에서 make는 명령이고 Makefile은 파일이며, 이 둘은 서로를 보완하며 프로젝트의 "자동 빌드"를 공동으로 구현합니다.

2. 메이크파일 로직

1. 단순한 의존성

Makefile은 주로 依赖关系로 구성 依赖方法되며 종속성 은 다음 目标으로 구성됩니다.依赖

가장 고전적인 형식은 다음과 같습니다.

target:dependence  #依赖关系
  command          #依赖方法

그 중 target생성할 타겟과 타겟이 dependence요구하는 종속성을 생성하는 것으로, 이 둘은 종속 관계를 형성 command하고 타겟이 실행할 명령을 생성하는 것이다.

알아채다:

  • 종속성에는 종속성이 여러 개 있거나 전혀 없을 수 있습니다.
  • Makefile은 다른 make에서 인식할 수 없는 makefile로 작성될 수도 있습니다. (이 글은 Makefile입니다)
  • 각 종속성은 [Tab] 키로 시작해야 합니다.

위의 테스트 코드를 예로 들어 보겠습니다.

여기에 이미지 설명 삽입
hello 파일을 생성하기 위해서는 hello.c 파일에 의존해야 하고 마지막으로 다음과 같은 의존성을 통해 대상 파일인 hello를 생성해야 한다.

2. 복잡한 종속성

위의 테스트 케이스는 이 디렉토리에 있는 파일인데, 그 안에 있는 파일이 이 디렉토리에 없으면 依赖关系Makefile 이 생성될 때 시스템이 자동으로 Makefile에서 같은 파일을 검색합니다.찾은 파일이 아직 없으면 이 디렉토리 다음으로 위의 작업을 반복합니다. (시스템은 스택의 결과를 이용하여 동작)依赖依赖关系依赖目标文件其它目标文件

먼저 위의 테스트 사례를 다음과 같이 수정해 보겠습니다.
여기에 이미지 설명 삽입

  • hello 파일을 생성하고 hello.o 파일에 의존
  • hello.o 파일을 생성하고 hello.s 파일에 의존
  • hello.s 파일을 생성하고 hello.i 파일에 의존
  • hello.i 파일을 생성하고 hello.c 파일에 의존
  • hello.c 파일은 이 디렉토리에 있습니다. 직접 사용하세요.

hello 파일을 생성하면 나머지 3개가 생성 目标文件되어 이 디렉토리에 저장됩니다.
여기에 이미지 설명 삽입

종속성은 다음과 같습니다.

여기에 이미지 설명 삽입

  • 다른 위치의 변경 은 생성에 目标文件영향을 미치지 않으며 Makefile 파일에서 동일한 검색 이며 대상 파일과 관련이 없습니다 . 여전히 위의 방법을 사용하여 파일을 생성하십시오.target1依赖目标文件位置

3. make 명령

1. 메이크의 사용

Linux에서 make 명령을 입력하면 시스템은 현재 디렉토리에서 Makefile을 검색하고 파일에서 첫 번째 종속성 및 종속 메서드를 찾은 후 실행하고 종속 메서드를 화면에 출력하고 대상 파일을 생성합니다.

위의 Makefile 테스트 사례를 다음과 같이 수정합니다.
여기에 이미지 설명 삽입
두 개의 종속성 집합을 생성합니다. (청소는 아래에서 설명하겠습니다)

make 테스트를 통과하려면 다음과 같이 하십시오.

여기에 이미지 설명 삽입
생성된 Makefile에서 다른 대상 파일을 삭제하려면 대상 파일을 지정해야 합니다.

make target1 target2   #make后可以有多个target目标文件
  1. 표적을 만들다

여기에 이미지 설명 삽입

  1. target1 target2 만들기

여기에 이미지 설명 삽입

2. 청소

프로젝트를 하다보면 불필요한 파일들이 항상 정리되는데, 우리 clean는 프로젝트 정리를 위한 대상 파일로 자주 사용합니다.

정리 파일은 다른 파일에 의존할 필요가 없기 때문에 정리에는 종속성이 없습니다.

clean이 Makefile의 첫 번째 대상 파일이 아닌 경우 이전 테스트와 마찬가지로 make 뒤에 clean을 추가하여 컴파일해야 합니다.

여기에 이미지 설명 삽입

3. 거짓 표적

.PHONY다음 형식으로 의사 대상이라고 하는 수정된 대상을 사용 합니다.

.PHONY:target

기능 : 파일을 항상 실행 가능하게 만들기

동일한 대상 파일을 생성하기 위해 make를 여러 번 사용하면 컴파일이 처음에는 통과할 수 있지만 그 이후에는 통과할 수 없으며 다음과 같은 결과가 표시됩니다.

여기에 이미지 설명 삽입
이때 .PHONY대상 파일 hello를 수정하여 항상 컴파일할 수 있는 의사 대상으로 만들 수 있습니다.

여기에 이미지 설명 삽입
참고: .PHONY수정 후 항상 컴파일할 수 있을 뿐만 아니라 깨끗한 개체 파일도 다음과 같이 항상 컴파일할 수 있습니다.

여기에 이미지 설명 삽입

4. make는 컴파일 여부를 어떻게 결정합니까?

우리는 위에서 테스트했습니다. 사용하지 않으면 .PHONYmake는 한 번만 사용할 수 있으며 컴파일할 수 없습니다. 그렇다면 make는 컴파일 여부를 어떻게 결정합니까?

우리가 프로젝트 작성을 끝내고 실행하고 싶을 때(일반적으로 프로젝트는 우리가 테스트한 지점이 아니라 매우 큽니다) 많은 시간과 성능을 낭비할 것입니다. 파일이 수정되면 프로젝트를 다시 구현하여 실행 파일을 생성할 수 있습니다.

make는 소스 파일과 대상 파일의 수정 시간을 비교하여 재컴파일 여부를 판단합니다.

  1. 소스 파일의 수정 시간이 대상 파일의 수정 시간보다 짧으면 컴파일하지 않음
  2. 소스 파일의 수정 시간이 대상 파일의 수정 시간보다 클 때 컴파일

Linux에서 각 파일은 다음과 같이 세 번 있습니다.

  • 액세스 시간(Access): cat, vim, less와 같은 파일 콘텐츠에 가장 최근에 액세스한 시간입니다.
  • 수정 시간(Modify): nano, vim과 같이 파일 내용이 마지막으로 수정된 시간입니다.
  • 변경 시간(Change): nano/vim(파일 크기 변경),

stat명령을 통해 파일의 세 번을 볼 수 있습니다.

여기에 이미지 설명 삽입

액세스 시간의 영향

make가 반복적으로 컴파일되는지 판단하기 위해 두 숫자의 수정 시간을 비교해야 하는 이유는 무엇입니까?

Linux에서 파일 액세스는 cat、less명령을 통해 수행할 수 있으며 이 두 명령을 통해 액세스한 파일은 다음 두 가지 이유로 자체 액세스 시간을 수정하지 않습니다.

  1. LInux에서 파일 접근은 매우 빈번한 작업이며, 파일 접근 시간을 수정하려면 매번 IO 작업을 해야 하므로 매번 접근 시간을 수정하면 시스템에 부담이 가중된다.
  2. 파일의 읽기 가능 여부는 파일의 권한에 따라 결정되며, 파일이 읽기 가능하다는 것은 파일 소유자 및 그룹이 읽기를 권장하지 않는다는 것을 의미하며 매번 액세스 시간을 수정할 필요가 없습니다. 시각.

따라서 Linux 액세스 시간은 다음 두 가지 경우에 변경됩니다.

  1. 방문 횟수가 일정 횟수 누적되거나 일정 시간 누적되면 업데이트됩니다.
  2. 파일의 수정 시간이 변경되면 그에 따라 변경됩니다.
    여기에 이미지 설명 삽입

여기에 이미지 설명 삽입

  • 위 사진은 vim 체크인 파일만 사용하고 수정은 하지 않았지만 수정 시간도 수시로 변경됩니다.

요약하자면: 파일이 수정되었는지 여부를 판단하려면 수정 시간이 변경되었는지 여부를 판단할 수 있습니다.

참고: 수정 시간이 변경되며 파일이 반드시 변경되는 것은 아닙니다.

수정 시간의 영향

소스파일의 수정시간이 변경되면 소스파일이 수정되었음을 의미하며 이때 make를 이용하여 다시 컴파일을 하여 수정시간을 갱신하기 위해 먼저 vim을
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
이용하여 touch 명령어를 사용하여 갱신하는 것으로 판단한다. 소스 파일의 모든 시간(터치 파일: 파일 파일 생성 없음, 파일은 항상 파일을 업데이트하기 위해 존재함), make 실행 여부를 판단하는 것은 소스 파일의 내용을 수정하는지 여부와 관련이 없습니다. .
여기에 이미지 설명 삽입
위의 지식에서 우리는 make 컴파일 여부가 소스 파일의 수정 시간과 관련이 있다는 결론을 내릴 수 있습니다. 그러면 ,PHONY대상 파일의 컴파일 여부가 수정 시간에 따라 판단되지 않는다는 것을 알 수 있으므로 효과를 얻을 수 있습니다. 항상 컴파일됩니다.

Supongo que te gusta

Origin blog.csdn.net/m0_52094687/article/details/128638478
Recomendado
Clasificación