42Seoul/libft

Makefile

재윤 2023. 3. 23. 20:53
반응형
  1. 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

 

 

참고 사이트

Makefile - 확장자 규칙, 특수 타겟

 

Makefile - 확장자 규칙, 특수 타겟

내부적으로 정의되어 있는 확장자 규칙  %.o: %.c $ (COMPILE.c) $(OUTPUT_OPTION...

blog.naver.com

gcc 컴파일 옵션 정리

 

gcc 컴파일 옵션 정리

=================================================================================================== [gcc 컴파일] 1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.3) g

jangpd007.tistory.com

Makefile

 

Makefile

make란, 파일 간 종속관계를 파악하여 Makefile(기술파일)에 적힌 대로 컴파일러에 명령하여 SHELL 명령이 실행되게 한다. 자동화를 통해 시간 절약 가능

velog.io

[C] 정적 라이브러리(아카이브) 파일 만들기

 

[C] 정적 라이브러리(아카이브) 파일 만들기

정적 라이브러리(아카이브) 파일 만드는 방법

velog.io

Makefile 만들기

 

Makefile 만들기

Makefile을 사용하는 이유는 위와 같은 복잡한 과정을 생략할 수 있어서이기도 하지만, Makefile이 제공하는 강력한 기능 중 하나인 Incremental build 를 사용하기 위해서다.

velog.io

 

〔Linux/Unix〕Makefile 이란? 메이크 파일 작성하는 방법

 

〔Linux/Unix〕Makefile 이란? 메이크 파일 작성하는 방법

1. Makefile 이란? Make: 주어진 쉘 명령어들을 조건에 맞게 실행하는 프로그램 Makefile: 어떤 조건으로 명령어를 실행할지 담은 파일 Incremental build: 반복적인 빌드 과정에서 변경된 소스코드에 의존성

love-every-moment.tistory.com

 

반응형

'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