본문 바로가기
서버/리눅스

[Linux] Makefile이란?

by 코딩히어로 2022. 1. 7.
728x90

리눅스에서 컴파일을 실행한다면 make 명령어를 통해 컴파일을 실행하는 경우가 많습니다.

make란 Makefile이 있는 디렉터리에서 make만 입력하면 컴파일이 진행됩니다.

이 make 명령어는 파일 관리 유틸리티로써 이러한 명령어에 의한 처리가 가능하게 해 줍니다.

 

그럼 make파일의 정의에 대해 먼저 보겠습니다.

 

파일 간의 종속관계를 파악해서 Makefile(기술 파일)에 적힌 순서대로 컴파일러에

명령을 전달하여 Shell명령이 순차적으로 실행될 수 있게 합니다.

 

이러한 make 파일을 쓰는 이유가 무엇일까요?

make 파일을 사용함으로써 얻을 수 있는 장점은 다음과 같습니다.

 

1. 각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약합니다.

2. 프로그램의 종속 구조를 빠르게 파악할 수 있습니다.

3. 단순 반복 작업 및 재작성을 최소 하하여 관리가 용이합니다.

 


기존의 컴파일은 gcc 컴파일러를 이용하여 진행하였습니다.

이 방법이 크게 불편한 점은 없지만 컴파일을 진행할 파일이 작은 경우가 아닌

100개 이상이 생겨난다면 굉장히 비효율적인 방법이 되어버립니다.

 

예를 들어 test.c라는 파일을 컴파일하기 위해서는

 

gcc -c o test.o test.c

위의 명령을 통해 컴파일 결과인 test.o라는 object 파일을 생성할 수 있습니다.

gcc 컴파일 과정에서 -o 옵션을 넣지 않아도 object 파일 이름이 파일 이름. o로 자동 생성됩니다.

 

하지만 실행 파일 생성 시 -o 옵션을 넣지 않으면

모든 파일이 파일 이름. out이라는 이름을 가지게 되므로 여러 개의

실행 파일을 생성해야 할 때 효율적인 옵션입니다.

 

gcc 컴파일러의 문제점은 여러 개의 파일을 할 때라고 하였습니다.

gcc -o test1.o test1.c
gcc -o test2.o test2.c
gcc -o test3.o test3.c
gcc -o test4.o test4.c
gcc -o test5.o test5.c
gcc -o test6.o test6.c
gcc -o test7.o test7.c
gcc -o test8.o test8.c
         ...

이런 식으로 gcc 컴파일러를 실행해야 하므로 비효율적입니다.


gcc컴파일러의 이러한 단점을 보완하기 위한 make 컴파일 과정에 대해 알아보겠습니다.

make 명령어를 실행하기 전에 먼저 Makefile을 작성해야 합니다.

 

Makefile의 구조는 다음과 같습니다.

CC = gcc

target1 : dependency1 dependency2
		command1
		command2
        
target2 : dependency3 dependency4
		command3
		command4

먼저 첫 번째 줄의 gcc 부분은 매크로의 정의를 의미합니다.

target1과 target2는 타깃을 정하는 구문이며

dependency는 그 타깃의 의존성을 정의합니다.

마지막으로 command는 명령어에 해당하는 구문입니다.

 

그럼 vi Makefile을 통해 아래와 같이 작성할 수 있습니다.

test_exe : test.o
		gcc -o test_exe test.o
        
test.o : test.c
		gcc -o test.o test.c
        
clean : rm *.o test_exe

이제 Shell상에 make를 사용하여 컴파일하고

make clean을 통해 컴파일된 object 파일들을 삭제할 수 있습니다.

728x90
반응형

'서버 > 리눅스' 카테고리의 다른 글

[Linux] 프로세스란?  (21) 2022.01.11
[Linux] chroot 500 oops error 해결  (8) 2022.01.10
[Linux] Directory file count  (0) 2021.12.28
[Linux] 일정 기간 지난 파일 삭제  (0) 2021.12.28
[Linux] Crontab이란?  (0) 2021.12.27

댓글