내 간단한 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.o
run
make
link.o
main.o
sum.o
link.o
main.o
sum.o
main.o
sum.o
link.o
답변1
이전 질문과 중복될 수 있습니다.make에서 "시스템이 지정된 파일을 찾을 수 없습니다" 문제의 정확한 원인은 무엇입니까?, 그러나 이것을 사용하여 무슨 일이 일어나고 있는지 자세히 설명하겠습니다.
Make는 Makefile 선언을 문자 그대로 받아들입니다:
run: link
run
가 필요하다고 말하면link
연관된 레시피가 을 생성하고run
실행해야 한다고 지시합니다.gcc link.o -o run
link.o: main.o sum.o
및 가link.o
필요 하다고 알려주고 관련 레시피가 생성하라고 지시하면 실행해야 합니다.main.o
sum.o
link.o
ld -r main.o sum.o -o link.o
main.o: main.c
main.o
가 필요하다고 말하면main.c
연관된 레시피가 을 생성하고main.o
실행해야 한다고 지시합니다.gcc -c main.c -o main.o
sum.o: sum.c
sum.c
같은 일을하고sum.o
당신이 달릴 때
make
Makefile에서 첫 번째 목표를 충족하려고 시도하면 파일이 run
없고 link
Makefile에서 빌드 방법을 지정하지 않습니다 link
..o
파일에서 확장자가 없는 파일을 만드는 방법을 "알게" 합니다., 그래서 내장된 규칙을 사용하여 link
;
cc link.o -o link
이것이 cc
명령의 소스입니다(엄밀히 말하면 Make 변수의 기본값입니다 $(CC)
).
사용 가능 해지면 link
Make는 전제 조건이 충족되었다고 가정 run
하고 적절한 레시피를 실행합니다.
gcc link.o -o run
알아채다link
실제로 사용되지 않음여기. 상황을 혼란스럽게 만들 뿐입니다. 첫 번째 규칙을 다음과 같이 작성해야 합니다.
run: link.o
구체적으로 Make는 run
다음과 같이 구문 분석합니다.
run
필요link
link
명시적인 규칙은 없지만 기본 제공 규칙을 사용하여 빌드할 수 있습니다.link.o
link.o
필요main.o
와sum.o
main.o
main.c
실존적 욕구sum.o
sum.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.o
와sum.o
main.o
main.c
실존적 욕구sum.o
sum.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