반응형
- Makefile으로 libft.a 라이브러리 만들기
Makefile은 쉽게 설명해서 아주 큰 프로젝트를 진행할 때 소스 파일(C파일)들을 한 번에 컴파일을 해야된다.
gcc 컴파일러를 사용하여 한 번에 컴파일을 하려고 했을 때
gcc strlen.c putchr.c
즉, gcc를 할 때 뒤에 모든 파일들이 와야한다.
만약 파일들이 100개 정도가 오면 적어줄 파일이 너무 많다.
그게 너무 귀찮아서 개발자분들이 makefile이라는 것을 만들었다고 생각하면 된다.
Makefile 기본 구조
Makefile은 타겟(Target), 의존성(Depedency), 명령(Recipe)의 세가지로 나뉜다.
<target> : <dependency>
(tab)<Recipe>
target은 대상 이름, 명령어에 의해 생성되는 파일, 아카이브 파일, 오브젝트 파일임. 즉 실행파일
Depedency는 target을 만들 때 무조건 필요한 것들임. 의존성에 있는 친구들은 makefile이 수정이 되었는지 확인하게 된다.
Recipe는 의존 관계 파일들이 변경됐거나 대상 파일이 없을 때 명령이 실행된다.
Makefile 기본적인 설명
- SRCS = $(wildcard *.c) OBJS = $(SRCS:.c=.o)SRCS = $(wildcard *.c)OBJS = $(SRCS:.c=.o)
- 같은 대입 참조 기법을 통해 확장자 .c 가 .o 로 바뀐다.
- $(wildcard *.c) 는 현재 디렉토리에서 *.c 와 파일명이 일치하는 파일을 찾아 공백을 구분 문자로 SRCS 매크로에 정의한다.
- Makefile - 확장자 규칙, 특수 타겟
- .c.o: $(SRCS) $(CC) $(CFLAGS) -c -o $@ $<.c.o을 TARGET으로 하면, Makefile의 .c파일을 모두 다 .o로 바꿔준다.ex) gcc -Wall -Wextra -Werror -c -o ft_strlen.o ft_strlen.c gcc 컴파일 옵션 정리
- -c, -o 명령어
- $@은 .o를 TARGET한다는 말이고, $<는 이를 위해 .c를 사용한다는 말.
- Makefile
- ar rc0. 정적 라이브러리(아카이브)란?ar 은 archive의 약자로 뜻 그대로 기록(파일)을 라이브러리에 보관한다고 생각하면된다..a 확장자 : 리눅스에서 사용하는 정적 라이브러리 파일2. ar 명령어 옵션r : 지정한 오브젝트 파일이 새로운 파일이면 추가, 기존파일이면 치환한다.c : 라이브러리(아카이브) 생성시 기본적으로 표준 에러를 기록하여 진단 메세지를 출력하는데 해당 출력을 제한한다.
- r : 지정한 오브젝트 파일이 새로운 파일이면 추가, 기존파일이면 치환한다.
- u : 오브젝트 파일의 수정시간을 비교해서 새로운 파일일 경우에만 치환한다.
- c : 라이브러리(아카이브) 생성시 기본적으로 표준 에러를 기록하여 진단 메세지를 출력하는데 해당 출력을 제한한다.
- s : 아카이브 파일의 정보를 담는 인덱스를 생성한다.
쉽게 말해서
- 오브젝트 파일들을 하나의 파일로 다룰 수 있도록 정리해 놓은 것.
clean
:make clean을 치게 되면 OBJS 파일들을 전부 지워준다.
fclean
:make fclean을 하면 clean 명령어를 실행 시키고 타겟을 지운다.
re
:fclean all
fclean 명령어를 실행한 후 all 명령어를 실행시킨다.
CC = gcc
CFLAGS = -Wall -Wextra -Werror
NAME = libft.a
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
all: $(NAME)
.c.o: $(SRCS)
$(CC) $(CFLAGS) -c -o $@ $<
$(NAME): $(OBJS)
ar cr $@ $(OBJS)
clean:
rm -f $(OBJS)
fclean: clean
rm -f $(NAME)
re: fclean all
.PHONY: clean fclean re
참고 사이트
〔Linux/Unix〕Makefile 이란? 메이크 파일 작성하는 방법
반응형
'42Seoul > libft' 카테고리의 다른 글
libft - strlcpy, strlcat, strncmo (0) | 2023.03.24 |
---|---|
libft - bzero, memcpy, memove (0) | 2023.03.24 |
libft - isascii, isprint, memset (0) | 2023.03.24 |
libft - isalpha, isdigit, isalnum (0) | 2023.03.24 |
libft.h 헤더 파일 만들기 (0) | 2023.03.23 |