목표
Level : 5
학습 목표
- 함수를 사용할 수 있다.
- 함수를 사용하여 변수를 치환할 수 있다.
---------
< 문제 >
.c 파일들을 .o 파일로 컴파일한 뒤, ft라는 이름의 정적라이브러리 파일(libft.a)로 만드시오.
< 제한 사항 >
- .c 파일들을 할당한 변수를 함수로 치환하여 .o 파일을 할당할 변수로 정의하시오.
- 패턴 Rule을 사용하여 오브젝트 파일 생성 규칙을 정의하시오 - Rule의 Recipe 작성 시 Target과 Dependency를 적절한 자동 변수(Automatic Variables)를 사용하여 작성하세요.
- Rule을 변수만으로 작성하시오.
- 적절한 변수를 할당하시오.
- ar 유틸리티를 사용하여 archive 하시오.
- 리링크되지 않아야 합니다.
코드
NAME := libft.a
SRCS := first.c second.c third.c
OBJS := $(SRCS:.c=.o)
AR := ar
ARFLAGS := -rc
CC := gcc
CFLAGS := -Wall -Wextra -Werror
$(NAME) : $(OBJS)
$(AR) $(ARFLAGS) $@ $?
%.o : %.c
$(CC) $(CFLAGS) -c $<
설명
변수 설명
NAME := libft.a: 생성할 정적 라이브러리의 이름을 NAME 변수에 할당합니다.
SRCS := first.c second.c third.c: 컴파일할 소스 파일들의 목록을 SRCS 변수에 할당합니다.
OBJS := $(SRCS:.c=.o): 함수를 사용하여 .c 파일들을 .o 파일로 치환하고, 그 결과를 OBJS 변수에 할당합니다.
AR := ar: 아카이브 유틸리티의 이름을 AR 변수에 할당합니다.
ARFLAGS := -rc: ar 명령어에 전달할 플래그를 ARFLAGS 변수에 할당합니다.
CC := gcc: C 컴파일러를 CC 변수에 할당합니다.
CFLAGS := -Wall -Wextra -Werror: 컴파일러 플래그를 CFLAGS 변수에 할당합니다.
함수로 변수 치환하기
$(SRCS:.c=.o): 이 함수는 SRCS 변수에 있는 각 .c 파일의 이름을 .o로 치환합니다. 예를 들어, first.c는 first.o로 치환됩니다. 이렇게 치환된 결과는 OBJS 변수에 할당됩니다.
패턴 Rule과 자동 변수(Automatic Variables) 설명
%.o : %.c: 이것은 패턴 Rule입니다. .c 파일이 .o 파일로 변환되는 일반적인 규칙을 정의합니다.
$<: 현재 타겟의 첫 번째 의존성을 나타냅니다. 여기서는 각각의 .c 파일이 됩니다.
$@: 현재 타겟의 이름을 나타냅니다. 여기서는 $(NAME)에 해당하는 libft.a가 됩니다.
$?: 타겟보다 더 최근에 업데이트된 모든 의존성 파일들의 목록을 나타냅니다. 여기서는 $(OBJS)에 해당하는 first.o, second.o, third.o 중 변경된 파일이 있으면 그것을 나타냅니다.
룰과 명령어
$(NAME) : $(OBJS): 이 룰은 $(NAME) (여기서는 libft.a)라는 타겟이 $(OBJS) (여기서는 first.o, second.o, third.o)라는 의존성을 가진다고 명시합니다.
$(AR) $(ARFLAGS) $@ $?: 이 명령어는 자동 변수를 사용하여 ar -rc libft.a first.o second.o third.o와 동일하게 작동하되, 변경된 오브젝트 파일만을 대상으로 합니다.
$(CC) $(CFLAGS) -c $<: 이 명령어는 각 .c 파일을 .o 파일로 컴파일합니다. 여기서 $(CC)는 C 컴파일러(일반적으로 gcc)를, $(CFLAGS)는 컴파일러 플래그를 나타냅니다.