파일이 중간 파일이고 자동으로 삭제될 수 있다는 것을 make에게 알려주는 것은 무엇입니까?

파일이 중간 파일이고 자동으로 삭제될 수 있다는 것을 make에게 알려주는 것은 무엇입니까?

나는 단지 만드는 법을 배우고 있는 중이에요. 나는 실수로 make의 중간 파일 자동 삭제에 관한 문제를 발견했습니다. 나는 make가 파일의 중간을 어떻게 표시할지(예: "자동으로 삭제됩니까?"라고 대답)를 더 잘 예측하고 싶었기 때문에 내 문제를 보여주기 위해 다음과 같은 더미 프로젝트를 작성했습니다.

안녕하세요.h

#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif

안녕하세요 c

#include <stdio.h>

void hello(const char *name) {
    printf("Hello %s\n", name);
}

메인 프로그램

#include "hello.h"
int main() {
    hello("world");
    return 0;
}

파일 생성

all: main
    ./main

clean:
    rm -f *.o *.a
    rm -f main

hello.o:
    gcc -c hello.c

libmyhello.a: hello.o
    ar -crv $@ hello.o

main: libmyhello.a
    gcc -L. -o $@ [email protected] -lmyhello

.PHONY: all clean

내가 만들면 main시간이 걸립니다 libmyhello.a. libmyhello.a필수 hello.o.제대로 이해했다면 hello.o중간 파일이어야 합니다. 하지만 그것은삭제되지 않음진행 중입니다 make main.

왜? make가 파일을 중간 파일로 취급하고 삭제하는지 어떻게 알 수 있나요?

답변1

중간 파일은 기본적으로 암시적 규칙 체인에서만 생성되며,아니요목표 또는 전제 조건으로 명시적으로 언급됩니다. 귀하의 경우 생성한 모든 파일은 Makefile에 명시적으로 언급되어 있으므로 중간 파일이 아닙니다.

파일을 전제 조건으로 나열하여 파일을 중간 파일로 만들 수 있습니다 .INTERMEDIATE.

.INTERMEDIATE: hello.o

일반적으로 말하면, 변경된 사항이 없더라도 다시 빌드하려면 libmyhello.a다시 빌드가 필요하기 때문에 더 많은 작업이 필요합니다. (그런데 이것을 전제 조건으로 나열 해야 합니다 .)hello.ohello.chello.chello.o

바라보다연결된 암시적 규칙의 중간 파일에 관한 부분자세한 내용은 GNU Make 매뉴얼을 참조하세요.

관련 정보