이 Makefile을 만나는 방법은 무엇입니까?

이 Makefile을 만나는 방법은 무엇입니까?

내 간단한 Makefile은 다음과 같습니다.

    #create an exe file
    run: link
            gcc link.o -o run
    
    #sketch link.o
    link.o: main.o sum.o
            ld -r main.o sum.o -o link.o
    
    #sketch main.o
    main.o: main.c
            gcc -c main.c -o main.o
    
    #sketch sum.o
    sum.o: sum.c
            gcc -c sum.c -o sum.o
    
    #make clean recipie
    clean:
            rm *.o
            rm run

이 메이크파일은 다소 미성숙하거나 약할 수 있습니다. 하지만 제가 정말 관심을 두는 것은 타겟이 어떻게 맞느냐 하는 것입니다. 실제 문제를 설명하기 전에 먼저 출력을 살펴보겠습니다.

gcc -c main.c -o main.o
gcc -c sum.c -o sum.o
ld -r main.o sum.o -o link.o
cc   link.o   -o link
gcc link.o -o run

내 질문은 다음 과 같습니다. 명령 섹션의 link종속성 으로 인해 또는 명령 섹션의 언급 run으로 인해 명령 이 찾고 다시 의존성 으로 인해 종속성에 대한 언급을 찾거나 명령 섹션을 클릭한 다음 대상에서 A 명령이 각각 발견 되고 ? 종속성에 언급된 파일 때문인가요, 아니면 명령에 언급된 파일 때문인가요?link.orunmakelink.omain.o sum.olink.omain.o sum.omain.osum.olink.o

답변1

이전 질문과 중복될 수 있습니다.make에서 "시스템이 지정된 파일을 찾을 수 없습니다" 문제의 정확한 원인은 무엇입니까?, 그러나 이것을 사용하여 무슨 일이 일어나고 있는지 자세히 설명하겠습니다.

Make는 Makefile 선언을 문자 그대로 받아들입니다:

  1. run: linkrun가 필요하다고 말하면 link연관된 레시피가 을 생성하고 run실행해야 한다고 지시합니다.gcc link.o -o run
  2. link.o: main.o sum.o및 가 link.o필요 하다고 알려주고 관련 레시피가 생성하라고 지시하면 실행해야 합니다.main.osum.olink.old -r main.o sum.o -o link.o
  3. main.o: main.cmain.o가 필요하다고 말하면 main.c연관된 레시피가 을 생성하고 main.o실행해야 한다고 지시합니다.gcc -c main.c -o main.o
  4. sum.o: sum.csum.c같은 일을하고sum.o

당신이 달릴 때

make

Makefile에서 첫 번째 목표를 충족하려고 시도하면 파일이 run없고 linkMakefile에서 빌드 방법을 지정하지 않습니다 link..o파일에서 확장자가 없는 파일을 만드는 방법을 "알게" 합니다., 그래서 내장된 규칙을 사용하여 link;

cc link.o -o link

이것이 cc명령의 소스입니다(엄밀히 말하면 Make 변수의 기본값입니다 $(CC)).

사용 가능 해지면 linkMake는 전제 조건이 충족되었다고 가정 run하고 적절한 레시피를 실행합니다.

gcc link.o -o run

알아채다link 실제로 사용되지 않음여기. 상황을 혼란스럽게 만들 뿐입니다. 첫 번째 규칙을 다음과 같이 작성해야 합니다.

run: link.o

구체적으로 Make는 run다음과 같이 구문 분석합니다.

  • run필요link
  • link명시적인 규칙은 없지만 기본 제공 규칙을 사용하여 빌드할 수 있습니다.link.o
  • link.o필요 main.osum.o
  • main.omain.c실존적 욕구
  • sum.osum.c실존적 욕구

이제 전제조건이 해결되었으므로 Make는 레시피를 실행할 수 있습니다.

  • gcc -c main.o -o main.o세워main.o
  • gcc -c sum.c -o sum.o세워sum.o
  • ld -r main.o sum.o -o link.o세워link.o
  • cc link.o -o link세워link
  • gcc link.o -o run세워run

run규칙을 로 다시 작성 하면 run: link.o해결 방법이 다음으로 변경됩니다.

  • run필요link.o
  • link.o필요 main.osum.o
  • main.omain.c실존적 욕구
  • sum.osum.c실존적 욕구

그리고 빌드

  • gcc -c main.o -o main.o세워main.o
  • gcc -c sum.c -o sum.o세워sum.o
  • ld -r main.o sum.o -o link.o세워link.o
  • gcc link.o -o run세워run

관련 정보