42 SEOUL/배운 것들 정리

#3 Makefile / gcc

hi._.0seon 2020. 12. 9. 16:11
반응형

makefile은 소스파일을 컴파일하기 용이하게 만들기 위해 사용하는 파일이다.

작성하는 프로그램의 크기가 커지면 파일이 여러개가 만들어지게 될 수 있는데, 그때 파일이 많아지고 각 파일의 크기가 커질수록 컴파일하는 시간과 링크하는데에 시간이 걸리게 된다.

이때, 한 파일만 수정했는데 전체 파일을 다시 컴파일하고 링크해야 한다면 시간이 오래 걸리므로, 수정한 파일만 컴파일 한 후 전체 파일을 링크하는 작업을 할 수 있도록 Makefile을 작성한다.

 

Makefile의 이름은 Makefile, makefile 무엇이든 상관없다. 다만 확장자가 따로 지정된 것이 없으므로 파일명만 가지고 makefile인지 알아볼 수 있도록 작성하는 것이 좋다.

 

SRCS = ft_putchar.c main.c
OBJS = ${SRCS:.c=.o}
CFLAGS = -Wall -Werror -Wextra
CC = gcc
RM = rm -f

all: ${OBJS}
	${CC} -o [실행파일명] ${OBJS}

.c.o:
	${CC} ${CFLAGS} -c $< -o ${<:.c=.o}

clean:
 	${RM} ${OBJS}

fclean: clean
    ${RM} [실행파일명]

re: fclean all

.PHONY: all clean fclean re

 

1. SRCS, OBJS, TARGET

변수명이라고 보면 된다.

[변수명] = [문자열]

변수명 옆에 나열한 파일들을 하나의 변수로 가리킨다.

- 여러 개의 문자열을 하나의 변수로 대체

- 매크로

1-1. OBJS = ${SRCS:.c=.o}

SRCS에서 시작하고, .c 파일을 .o 파일로 변환하라고 알려줌

== $(wildcard srcs/*.c)

2. all, .c.o, clean : 규칙

$ make

터미널에서 make만 입력하면 makefile에 입력된 가장 첫번째 규칙을 찾아 실행한다.

2-1. all

규칙명 옆에는 규칙을 실행하기 위해 필요한 파일을 적는다. (의존성, 규칙을 실행하기 위해 필요한 종속 항목 리스트)

.o 파일이 없으면 makefile이 .o 파일을 만들어준다.

.c 파일이 수정된 경우 수정된 파일만 다시 컴파일해서 .o 파일을 만들어 준다.

.o 파일이 새로 수정된 것이 있는 경우 다시 빌드해서 실행파일을 생성한다.

2-2. .c.o

.c 파일을 .o로 바꾸는 규칙

.c 를 .o 파일로 바꾸는 타겟이 없는 경우에는 ${CC} ${CFLAGS} -c -o ${<:.c=.o} $< 를 기본으로 실행한다.

CFLAGS 이름의 매크로가 정의되어 있지 않으면 ${CFLAGS} 옵션을 제외하고 실행함

2-3. .PHONY (포니 타겟)

make 요청을 하는 경우에 실행되는 명령을 위한 목적으로 사용된다.

 

1. 동일한 이름의 파일을 사용한 충돌을 피하기 위함

2. make 성능 향상을 위해

 

clean:

        rm ${OBJS}

 

이 상태에서 make clean 을 실행하려고 할 때, clean이라는 파일이 존재한다면 타겟 clean은 실행되지 않는다.

clean 파일은 이전에 존재하지 않았기 때문에 항상 최신이라고 간주될 것이다. make는 최신인 경우 해당 타겟을 실행하지 않고 작업을 멈춘다.

 

.PHONY: clean

부분을 추가하게 되면, make clean 명령은 clean 이름을 가진 파일의 존재 여부를 검사하지 않고 명령을 수행한다.

 

pinocc.tistory.com/131

 

[Make] PHONY / FORCE

이 내용은 ftp://ftp.gnu.org/pub/pub/old-gnu/Manuals/make-3.79.1/html_chapter/make_4.html 중 일부를 번역한 내용이다. 1. Phony Targets(포니 타겟) 포니 타겟은 실제 파일 이름을 나타내는 타겟 이름이 아니..

pinocc.tistory.com

 

$<

name of current dependency

$*

name of current dependency without extension

$@

현재 타겟의 이름

$^

현재 타겟의 종속 항목 리스트

 

3. GCC 옵션

3.1. -l (소문자 L)

링크할 라이브러리를 명시하는 옵션

정적 라이브러리를 링크시키는데 사용됨

ex) libmylib.a -> -lmylib

3.2. -L

라이브러리 위치를 정해주는 옵션

-L<디렉토리명>

3.3. -D

gcc 사용 시 매크로 정의

3.4. -I (대문자 i)

헤더파일을 검색하는 디렉토리 목록

3.5 ar

정적 라이브러리 파일을 생성한다.

 

3.6 매크로 포함 컴파일하기

gcc -D BUFFER_SIZE=xx

  • 소스파일에서 매크로를 추가한 것과 동일한 기능
    #define BUFFER_SIZE xx
  • 소스파일에서 define 을 해주지 않아도 컴파일 시 옵션 포함하여 컴파일하면 BUFFER_SIZE 매크로를 그대로 사용할 수 있다.

 

lifeiseggs.tistory.com/557

 

gcc 툴체인 옵션 간단 정리

- 정말 오래전에 정리해둔 파일을 발견, 웹에 옮겨 둔다. gcc -c : 컴파일만 -nostdinc / - nostdinc++ : 표준 헤더파일을 디렉토리를 검색하지 않는다. -o : 출력파일 이름 -static : 정정 링크를 해서 실행파

lifeiseggs.tistory.com

 

반응형