[컴실] 2주차 Makefile

진실·2021년 10월 15일
0
post-custom-banner

Makefile

gcc에서 여러 개의 소스파일을 컴파일 하는 경우가 있다.
fun1.c fun2.c fun3.c header.h를 컴파일 한다고 해보자

gcc fun1.c fun2.c fun3.c
gcc -c fun1.c
gcc -c fun2.c
gcc -c fun3.c
gcc fun1.o fun2.o fun3.0

위의 두 가지 방법으로 컴파일 할 수 있다. 대충 보기엔 첫번째 방법이 간결하고 편해보이나, 두번째 방법이 효율성 측면에선 더 좋다. 바뀐 내용이 있는 파일의 object file만 새로 만들면 되기 때문이다.
그럼 매번 위의 명령어를 계속 입력해서 컴파일을 하면 굉장히 번거로울 것이다.
이를 간결하게 만들어주는 것이 Makefile이다.

Makefile의 기본적인 구조

target : prerequisite
    recipe
  • target : 목표가 되는 파일. 일반적으로 실행 파일이나 object 파일이 여기에 속한다
  • prerequisite : 목표가 되는 파일을 만들기 위한 준비물. prerequiste이 바뀌면 target도 같이 바뀌게 된다. 이러한 관계를 의존 관계라고 한다.
  • recipe : prerequisite에서 target을 만들기 위한 방법

Makefile 만들기

그럼 이를 바탕으로 fun1.c fun2.c fun3.c를 컴파일해서 exe라는 실행파일을 만드는 Makefile을 만들어 보자

cc = gcc
target = exe
objects = fun1.o fun2.o fun3.o

$(target) : $(objects)
    cc -o $(target) $(objects)

$(objects) : header.h

clean : 
    rm $(target) $(objects)

성공!
exe를 만드는 데는 object file들이 필요하고, object file을 만드는 데는 header.h가 필요하다.

근데 여기서 의문. 왜 .o 파일을 만드는 레시피는 없을까?
이는 gcc가 implicit rule을 사용하기 때문이다. make를 할 때 .o file을 만드는 recipe가 존재하지 않으면 알아서 .o 파일과 이름이 같은 .c 파일을 찾고, 거기서 .o 파일을 만들어준다!!!

profile
반갑습니다.
post-custom-banner

0개의 댓글