안녕하세요, WH 입니다.
make 에 대해 알아보는 글입니다.
바로 전 글에서 compile 과정에 대해서 설명했었는데요.
compile 과정은 여러개의 소스코드를 목적 파일을 만들고
해당 목적코드들을 링크하여 실행파일을 만든다고 설명했었습니다.
그런데 이런 생각을 해볼까요?
기능별로 코드를 짜다보니 소스코드 파일이 100개를 만들었다고 해봅시다.
힘들게 힘들게 하나하나 목적파일을 생성하고 링크해서 실행파일을 만들었어요.
그런데, 해당 파일에 문제가 생겨서 파일을 다시 컴파일을 해야한다고 가정해볼까요?
100개를...다시 ..목적파일 만들고.. 링크하려면.. ㅎㅎ
이런 문제를 해결하기 위해 make를 사용합니다.
make는 무엇일까요?
make
파일 간의 종속 관계를 파악하여 makefile에 적힌 대로 컴파일러에 명령하여 쉘이 순차적으로 실행
makefile은 무엇일까요?
makefile
목적파일, 의존성, 명령어, 매크로 등을 활용하여 컴파일을 쉽게하기 위해 사용하는 make파일의 설정 파일
makefile 매크로 설명 ( make -p 로 확인 가능 )
매크로 명 | 용도 |
DEFS | Define 추가 시 사용 |
CFLAGS | gcc의 옵션 추가 시 사용 |
CC | 컴파일러는 변경 시 사용 |
CPPFLAGS | c++ 의 옵션 추가 시 사용 |
CXX | c++ 의 컴파일러 선택 시 사용 |
LDFLAGS | ld 의 옵션 세팅 |
그래, 그럼 이제 make랑 makefile이 뭔지는 알겠는데, 어떻게 사용하는지가 궁금하시죠? 간단하게 만들어보겠습니다.
우리가 만드는 프로그램은 입출력으로 이루어졌다고 가정합시다. 즉 3개의 간단한 소스파일이 존재하는데, main.c, input.c, output.c 라는 3 개의 소스코드가 있고 io.h 를 공통으로 사용한다고 하겠습니다.
1. make를 활용하지 않은 컴파일 예시
$ gcc -c main.c
$ gcc -c input.c
$ gcc -c output.c
$ gcc -o program main.c input.c output.c 를 작성하면 컴파일이 완료됩니다.
이제부터는 같은 makefile이지만 다양한 방법의 makefile을 작성해보도록하겠습니다.
2-1. make 파일 활용 예시1
파일명 : makefile
내용
-------------------------------------------------------
program : main.c input.c output.c
gcc -o program main.o input.o output.o
main.o : io.h main.c
gcc -c main.c
input.o : io.h input.c
gcc -c input.c
output.o : io.h input.c
gcc -c ouput.c
-------------------------------------------------------
2-2 매크로를 활용한 예시2
-------------------------------------------------------
OBJECTS = main.o input.o output.o
CC = gcc
TARGET = program
$(TARGET) : $(OBJECTS)
$(CC) -o $(TARGET) $(OBJECTS)
clean :
rm -rf $(OBJECTS $(TARGET) core
main.o : io.h main.c
gcc -c main.c
input.o : io.h input.c
gcc -c input.c
output.o : io.h input.c
gcc -c ouput.c
-------------------------------------------------------
참고 내부 매크로
$* <- 확장자가 없는 현재의 목표 파일(Target)
$@ <- 현재의 목표 파일(Target)
$< <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$? <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름
'임베디드 리눅스' 카테고리의 다른 글
MCU? MPU? CPU? 그게 뭔데 (0) | 2022.01.27 |
---|---|
make 는 무엇이며 왜 사용하는 것일까 2 (0) | 2022.01.26 |
c언어 컴파일 과정 (0) | 2022.01.25 |
virtualbox 활용하여 환경 설정하기 (0) | 2022.01.25 |
docker를 활용한 이미지 배포하기( feat. dockfile ) (0) | 2022.01.25 |