본문 바로가기

IT 공부/C언어

[Linux] Makefile 관련 공부

이번에 42서울 첫과제인 Libft를 진행하면서 라피신때 어느정도 맛보기를 한 makefile에 대해 조금 알게되었고 구현하게되었다. 

 

선행 지식 

 C 프로그램의 빌드 절차

  1. 컴파일 : 소스파일을 각각 컴파일하여 Object파일(*.o)을 생성하고,
  2. 링크 : 이들을 한 데 묶는 링크 과정을 통해서 실행 파일인 a.out을 생성한다. 여기서 소스파일에 정의된 함수를 main에서 호출하는 의존성이 존재한다.

compile이란?

소스 코드(.c)를 작성하고 실행 파일 (.exe)을 만드는 것을 컴파일이라고 생각하겠지만 이것은 컴파일러가 하는 역할이지 컴파일은 아니다. 컴파일의 개념은 소스 코드(원시 코드) 목적 파일로 바꾸는 것이다.

 

Makefile이란? 

linux상에서 반복 적으로 발생하는 컴파일을 쉽게하기위해서 사용하는 make 프로그램의 설정 파일이다.

Makefile을 통하여 library 및 컴파일 환경을 관리 할수 있다.

 

매크로 정의

Makefile 매크로는 make -p 명령을 shell에서 내리면 make 내부에 정의된 매크로 리스트들이 나열된다.

$(NAME), bonus가 위치하는곳이 타겟절

: 을 기준으로 그옆의 ${OBJS}있는 부분이 의존성 , 즉 재료 

그밑에 ${AR}로 시작하는 부분이 명령어 부분이다. 

Makefile은 기본적으로 목표(target), 의존 관계(dependency), 명령(command)의 세개로 이루어진 기본적인 규칙들이

계속적으로 나열되어 있다.

Makefile 기본 패턴

CC=<컴파일러>
CFLAGS=<컴파일 옵션>
LDFLAGS=<링크 옵션>
LDLIBS=<링크 라이브러리 목록>
OBJS=<Object 파일 목록>
TARGET=<빌드 대상 이름>

all: $(TARGET)

clean:
    rm -f *.o
    rm -f $(TARGET)

$(TARGET): $(OBJS)$(CC) -o $@ $(OBJS)

그렇다면 이러한 Makefile을 왜사용하는가 ?

- 프로그램의 종속 구조를 빠르게 파악하고 관리가 용이하며 단순 반복 작업및 재작성을 최소화

- 각 파일에 대한 반복적 명령의 자동화로 인한 시간절약을 할수 있다는 점이있다. 

 

gcc의 옵션

-c : object파일을 생성하는 옵션

-o : 생성 될 파일 이름을 지정하는 옵션.

 

정적 라이브러리 만드는 명령어

ar rc lib[라이브러리명칭].a [목적파일]

ar : 파일들을 모아 아카이브(라이브러리)파일로 압축을 해주는 명령어의 매크로.

r : 새로운 오브젝트 파일이면 추가, 기존 파일이면 치환.

c : 아카이브(라이브러리 파일) 생성, 존재하지 않는 아카이브를 작성하는 경우에도 경고 메세지를 출력하지 않음.

 

$@ : target $< : 열거된 depend 중 가장 왼쪽의 depend 파일

$^ : depend 전체 파일 $? : target과 depend의 변경 날짜를 비교해 변경된 depend만 선택하는 매크로

 

.pony

Makefile와 같은 폴더에 clean이나 fclean의 이름을 가진 파일이 존재하면 명령어를 실행하지않는다.