강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

리눅스 어플리케이션 컴파일을 위한 make

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

리눅스 어플리케이션 컴파일을 위한 make

 

 

 

 

흔히 리눅스에서는 gcc라는 컴파일러를 이용하여 컴파일을 합니다.

 

 

 

 하지만 gcc컴파일러를 이용하여 컴파일을 할 때에는 필요한 많은 옵션들을 직접 지정해야 하는 어려움이 있습니다.

 

 

 

 이번에 설명하는 make를 이용하면 이런 일련의 과정들을 Makefile이라는 컴파일스팩파일”(필자가 임의대로 붙인 이름)에 작성된 순서대로 컴파일을 수행하게 됩니다.

 

 

 

 , 컴파일을 쉽게 할 수 있도록 도와주는 유틸리티라고 할 수 있습니다.

 

 

 

 흔히 아파치(Apache) MySQL등과 같은 어플리케이션들을 리눅스 서버에 직접 설치할 때에 make명령어를 사용하는 것을 많이 보셨을 것입니다.

 

 

 

 , make명령어를 실행하면 현재 디렉토리에 있는 Makefile을 찾아서 Makefile파일 내에 있는 각 행들을 순서대로 하나씩 gcc컴파일과 관련 작업들을 수행해 주게 됩니다.

 

 

 

 

 

참고로 알아 두셔야 할 것은 make에 꼭 필요한 Makefile 파일은 다음과 같이 3부분으로 구성되어 있습니다.

 

 

 

 

 

target : dependency
          command
          .....
          .....

 

 

 

 

위의 구성에서 target부분은 목표부분으로서 컴파일이 수행된 후에 완료되어 생성될 오브젝트파일(목적파일, object file)이름을 지정합니다.

 

 

 

 


그리고 command(명령)부분은 실행될 명령어가 순차적으로 입력되어 있는 부분입니다.

 

 

 

 그리고 dependency부분은 의존관계부분입니다.

 

 

 

 

 

다음은 간단한 gdchart프로그램을 컴파일 하기 위한 makefile 예입니다.

 

 

 

 비교적 간단한 예이지만 Apache MySQL 같은 어플리케이션에서의 Makefile 상당히 복잡하게 구성되어 있습니다.

 

 

 

 

 

[root@command gdchart0.94b]# cat makefile

GDC_INCL = .

GD_INCL  = gd1.3

GD_LIB   = gd1.3

 

CC=gcc

 

all: gdc_samp1 gdc_samp2 gdc_pie_samp

 

# compile the samples

gdc_samp1: gdc.o gdchart.o price_conv.o gdc_samp1.o $(GD_LIB)/libgd.a

        $(CC) -o gdc_samp1 gdc.o gdchart.o price_conv.o gdc_samp1.o -L$(GD_LIB) -lgd -lm

 

gdc_samp1.o: $(GDC_INCL)/gdc.h $(GDC_INCL)/gdchart.h gdc_samp1.c

        $(CC) -I$(GDC_INCL) -c gdc_samp1.c

 

gdc_samp2: gdc.o gdchart.o price_conv.o gdc_samp2.o $(GD_LIB)/libgd.a

        $(CC) -o gdc_samp2 gdc.o gdchart.o price_conv.o gdc_samp2.o -L$(GD_LIB) -lgd -lm

 

gdc_samp2.o: $(GDC_INCL)/gdc.h $(GDC_INCL)/gdchart.h gdc_samp2.c

        $(CC) -I$(GDC_INCL) -c gdc_samp2.c

 

gdc_pie_samp: gdc.o gdc_pie.o price_conv.o gdc_pie_samp.o $(GD_LIB)/libgd.a

        $(CC) -o gdc_pie_samp gdc.o gdc_pie.o price_conv.o gdc_pie_samp.o -L$(GD_LIB) -lgd -lm

 

gdc_pie_samp.o: $(GDC_INCL)/gdc.h $(GDC_INCL)/gdcpie.h gdc_pie_samp.c

        $(CC) -I$(GDC_INCL) -c gdc_pie_samp.c

 

# --- compile the lib ---

price_conv.o: price_conv.c

        $(CC) -c price_conv.c

 

gdc.o: gdc.c gdc.h

        $(CC) -I$(GD_INCL) -I$(GDC_INCL) -c gdc.c

 

gdc_pie.o: $(GDC_INCL)/gdc.h $(GDC_INCL)/gdcpie.h gdc_pie.c

        $(CC) -I$(GD_INCL) -I$(GDC_INCL) -c gdc_pie.c

 

gdchart.o: $(GDC_INCL)/gdc.h $(GDC_INCL)/gdchart.h gdchart.c

        $(CC) -I$(GD_INCL) -I$(GDC_INCL) -c gdchart.c

 

$(GD_LIB)/libgd.a:

        cd $(GD_LIB) ; make -f Makefile libgd.a

 

# --- clean ---

clean:

        rm -f *.o gdc_samp1 gdc_samp2 gdc_pie_samp

        cd $(GD_LIB) ; make -f Makefile clean

 

[root@command gdchart0.94b]#

 

 

 

 

 


makefile
위와 같을 경우에 make 실행하면 makefile 작성되어있는 내용을 참고하여 직접 컴파일 하게 됩니다.

 

 

 

 , 아래는 make파일을 실행한 것입니다.

 

 

 

 

 

[root@command gdchart0.94b]# make

gcc -Igd1.3 -I. -c gdc.c

gcc -Igd1.3 -I. -c gdchart.c

gcc -c price_conv.c

gcc -I. -c gdc_samp1.c

cd gd1.3 ; make -f Makefile libgd.a

make[1]: Entering directory `/usr/local/gdchart0.94b/gd1.3'

gcc  -O   -c -o gd.o gd.c

gcc  -O   -c -o gdfontt.o gdfontt.c

gcc  -O   -c -o gdfonts.o gdfonts.c

gcc  -O   -c -o gdfontmb.o gdfontmb.c

gcc  -O   -c -o gdfontl.o gdfontl.c

gcc  -O   -c -o gdfontg.o gdfontg.c

rm -f libgd.a

ar rc libgd.a gd.o gdfontt.o gdfonts.o gdfontmb.o \

        gdfontl.o gdfontg.o

make[1]: Leaving directory `/usr/local/gdchart0.94b/gd1.3'

gcc -o gdc_samp1 gdc.o gdchart.o price_conv.o gdc_samp1.o -Lgd1.3 -lgd -lm

gcc -I. -c gdc_samp2.c

gcc -o gdc_samp2 gdc.o gdchart.o price_conv.o gdc_samp2.o -Lgd1.3 -lgd -lm

gcc -Igd1.3 -I. -c gdc_pie.c

gdc_pie.c: In function `pie_gif':

gdc_pie.c:584: warning: deprecated use of label at end of compound statement

gcc -I. -c gdc_pie_samp.c

gcc -o gdc_pie_samp gdc.o gdc_pie.o price_conv.o gdc_pie_samp.o -Lgd1.3 -lgd -lm

[root@command gdchart0.94b]#



 

 

 

앞에서 설명 드린 make 실행은 옵션 없이 간단히 실행할 있습니다.

 

 

 

  make명령어에는 굉장히 많은 옵션들이 있습니다.

 

 

 

 이들 옵션들의 내용을 하나씩 모두 살펴보는 것도 물론 중요하겠지만 실무에서 사용되는 방법과 용도에 대해서 보다 명확하게 확인하는 것이 보다 중요할 것입니다.

 

 

 

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,156 명
  • 현재 강좌수 :  36,490 개
  • 현재 접속자 :  278 명