You cannot see this page without javascript.

make - 03 make의 사용

Programing 조회 수 255 추천 수 0 2017.02.22 17:11:28

$  make [-f  makeFileName]

 

보통 default로 makefile이라는 이름을 쓴다.

 

make

make는 서로 의존 관계가 있는 여러 파일로 이루어진 프로그램에서 효과를 볼 수 있음으로 다음과 같은 파일을 작성한다.
main_test.c는 fcun1.c와 func2.c.의 함수를 사용하고 모든 .c파일은 io.h를 include하는 프로그램이 있다고 하자.

 

① 소스파일 작성

io.h   <파일 1>
1: #ifndef __IO_H__
2:    #define __IO_H__
3:    #include <stdio.h>
4: #endif

 

main_test.c   <파일 2>
1: #include "io.h"
2:
3: int main(void)
4: {
5:     printf("main start..\n");
6:     func1();
7:     func2();
8:     printf("main end..\n");9: }

 

func1.c   <파일 3>
1: #include "io.h"
2:
3: void func1(void)
4: {
5:     printf("func1 start..\n");
6:     printf("func1 end..\n");7: }

 

func2.c   <파일 4>
1: #include "io.h"
2:
3: void func2(void)
4: {
5:     printf("func2 start..\n");
6:     printf("func2 end..\n");7: }

 

 

② makefile 작성

makefile   <makefile 작성>
1: test : main_test.o func1.o func2.o
2:    cc -o test main_test.o func1.o func2.o
3: main_test.o : io.h main_test.c
4:    cc -c main_test.c
5: func1.o : io.h func1.c
6:    cc -c func1.c
7: func2.o: io.h func2.c
8:    cc -c func2.c

 

컴파일을 할 명령의 시작 부분을 TAB으로 시작함을 주의한다.

 

③ make 실행

$  make
        cc -c main_test.c
        cc -c func1.c
        cc -c func2.c
        cc -o test main_test.o func1.o func2.o

make의 실행과정을 보면 makefile의 순서대로 컴파일하지 않음을 알 수 있다. 즉 make가 makefile에서 가장 먼저 실행하는 명령은 의존 관계 트리에서 가장 하위 대상에 속한 명령이 된다.

 

003.png

 

 

③의 가장 하위에 있는 main_test.c, func1.c, func2.c io.h는 의존되는 파일일 뿐 대상이 아니며, 가장 하위 대상인 ②의 main_test.o, func1.o, func2.o 이므로 여기에 속한 명령이 가장 먼저 실행된다. 또한 main_test.o, func1.o, func2.o는 test가 의존하는 파일이기도 하다.
생성된 test파일을 실행해 보자.
$  ./test
main start..
func1 start..
func1 end..
func2 start..
func2 end..
main end..

 

④ 특정 파일 수정
만약 어느 특정 파일이 수정되었다면 그 파일과 의존적인 관계가 있는 파일은 다시 컴파일 될 것이다.

$  touch func1.c
$  make
        cc -c func1.c
        cc -o test main_test.o func1.o func2.o

func1만 수정되었으므로 func1.o를 새로 생성하게 되면 test는 func1.o에 의존하므로 test도 새롭게 생성될 것이다.
만약 수정된 파일이 없는 상태에서 make를 실행하면 다음과 같이 make는 실행되지 않는다.

$  make
`test'은(는) 최신 것입니다.

 

⑤ 레이블 대상
make 파일의 대상에는 실행파일과 오브젝트 파일뿐만 아니라 사용자가 임의로 정한 레이블 이름이 올 수 있다. 레이블 이름은 실제 파일에 대응하지 않기 때문에 가짜 대상이라도 부르며, 이런 레이블 대상은 사용자가 원할 때 make 가 특정 명령을 실행하도록 하기 위함이다. 그리고 레이블 대상은 의존성을 갖지 않으므로 레이블을 만날 때마다 대상이 항상 최신으로 업데이트된 상태로 간주한다.

 

makefile  <makefile 작성>
1: test : main_test.o func1.o func2.o
2:    cc -o test main_test.o func1.o func2.o
3: main_test.o : io.h main_test.c
4:    cc -c main_test.c
5: func1.o : io.h func1.c
6:    cc -c func1.c
7: func2.o: io.h func2.c
8:    cc -c func2.c
9: clean :  ------------------> 레이블 대상
10:    rm main_test.o func1.o func2.o

 

$  make clean -> 가짜 대상을 실행한다.(특정 대상만 실행한다)
  rm main_test.o func1.o func2.o

 

첨부
엮인글 :
List of Articles
번호 제목 글쓴이 날짜 조회 수
369 APM mariadb download origin address LynX 2019-06-19 1991
368 APM What one can and should optimize LynX 2019-06-03 1418
367 CentOS mariadb install LynX 2019-05-31 1182
366 CentOS init mode change LynX 2019-05-30 1290
365 APM ext zip install LynX 2019-02-19 1614
364 APM ext ImageMagick install LynX 2019-02-19 513
363 3D Printer Pronterface(PrintRun) install file LynX 2018-09-13 753
362 CentOS Grub UUID change LynX 2018-08-08 869
361 Linux letsencrypt wildcard LynX 2018-07-26 798
360 Printer cura usb connection LynX 2018-07-06 666
359 CentOS cli 무선랜 LynX 2018-06-07 448
358 APM 윈도우에 APM 페키지 설치 file LynX 2018-05-04 590
357 APM MySQLTuner 설치 LynX 2018-04-27 545
356 CentOS CentOS7 커널 업데이트 LynX 2018-04-23 702
355 HTML Tag CSS 여러가지 모양 만들기 LynX 2018-02-08 772
354 Linux wkhtmltopdf wkhtmltoimage install LynX 2018-01-31 602
353 APM LZ4_LIBS Not Found (CentOS7, MariaDB 10.1.29) LynX 2018-01-03 485
352 APM mysql ./configure LynX 2017-12-15 805
351 APM PHP-7.2.0 LynX 2017-12-12 3157
350 Linux libiconv LynX 2017-12-08 558

XE Login