티스토리 뷰

make를 쓰는 이유 
- 각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약 
- 프로그램의 종속 구조를 빠르게 파악 할수 있으며 관리가 용이하다. 
dep절에서 의존성을 파악할수가 있다. 
- 단순 반복 작업 및 재작성을 최소화한다. 
많은 c소스들중에 하나를 수정해도 make가 담겨진 쉘한번을 돌리면 편리하게 전체 재 컴파일을 할수가 있다. 

.SUFFIXES : .c .o 
CC = gcc 
INC = <- include 되는 헤더 파일의 패스를 추가한다. 
LIBS = <- 링크할 때 필요한 라이브러리를 추가한다. 
CFLAGS = -g $(INC) <- 컴파일에 필요한 각종 옵션을 추가한다. 
OBJS = <- 목적 파일의 이름을 적는다. 
SRCS = <- 소스 파일의 이름을 적는다. 
TARGET = <- 링크 후에 생성될 실행 파일의 이름을 적는다. 
all : $(TARGET) 
$(TARGET) : $(OBJS) 
$(CC) -o $@ $(OBJS) $(LIBS) 
dep : 
gccmakedep $(INC) $(SRCS) 
clean : 
rm -rf $(OBJS) $(TARGET) core 
new : 
$(MAKE) clean 
$(MAKE)


1.연습할 디렉토리 생성
> mkdir study_make 
2. 헤더 생성
> vi tak.h
내용 : 
#include 
void test1();   - memo
void test2(); = calendar
3. c파일 생성 
>  vi test1.c 

#include "tak.h"
void test1(){
printf("called test1 !!!\n");
}
> vi test2.c
#include "tak.h"
void test2(){
printf("called test2 !!!\n");
}
> vi main.c 
#include "tak.h"
void main(void){
test1();
test2();
return 0;
}

4. 생성된 파일 확인 

tmax2@tak:/home/tmax2/study_make> ls
main.c  tak.h  test1.c  test2.c

5. object 파일 생성
>  gcc -c -o  test1.o test1.c
>  gcc -c -o  test2.o test2.c
>  gcc -c -o  main.o main.c

gcc 설명 
-c 는 object 파일을 생성하는 옵션 
-o 는 생성될 파일의 이름을 지정하는 옵션

6.  생성된 파일 재확인 

tmax2@tak:/home/tmax2/study_make> ls
main.c  main.o  tak.h  test1.c  test1.o  test2.c  test2.o

7. 묶어서 컴파일 (실행 파일 만들기)

> gcc -o taks_exe main.o test1.o test2.o

tmax2@tak:/home/tmax2/study_make> ls
main.c  main.o  tak.h  taks_exe  test1.c  test1.o  test2.c  test2.o

taks_exe가 생성됨을 확인할수가 있다. 

8. taks_exe파일 실행 
tmax2@tak:/home/tmax2/study_make> ./taks_exe
called test1 !!!
called test2 !!!

정상적으로 test1 부터 test2까지 실행되는 모습을  확인할수가 있다. 
하지만 이렇게 간단한 컴파일 과정일지라도 만약 1000개에 육박하는 c소스들을 컴파일 해야한다면 굉장히 난해할것이다. 
그만큼의 커맨드를 일일히 날려야 하기 때문이다. 이런 문제를 해결해주는것이 바로 make



make 구성 

-목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일
-의존성(Dependency) : 목적파일을 만들기 위해 필요한 재료
-명령어(Command) : 실행 되어야 할 명령어들
-매크로(macro) : 코드를 단순화 시키기 위한 방법


9. make 파일 생성

> vi Makefile

taks_exe : test1.o test2.o main.o
        gcc -o taks_exe test1.o test2.o main.o
test1.o : test1.c
        gcc -c -o test1.o test1.c
test2.o : test2.c
        gcc -c -o  test2.o test2.c
main.o : main.c
        gcc -c -o main.o main.c
clean :
        rm *.o taks_exe

타겟절 : 의존성 
실행할 커맨드 


clean은 c소스를 제외한 object파일과 실행파일을 지워주는 커맨드를 날리게끔 작성한다. 


tmax2@tak:/home/tmax2/study_make> make
gcc -c -o main.o main.c
main.c: In function 'main':
main.c:5:4: warning: 'return' with a value, in function returning void [enabled by default]
    return 0;
    ^
gcc -o taks_exe test1.o test2.o main.o
tmax2@tak:/home/tmax2/study_make> ll
합계 44
-rw-rw-rw-. 1 tmax2 tmax2  232  2월 19 09:43 Makefile
-rw-rw-rw-. 1 tmax2 tmax2   78  2월 19 09:27 main.c
-rw-rw-rw-. 1 tmax2 tmax2 1432  2월 19 09:43 main.o
-rw-rw-rw-. 1 tmax2 tmax2   49  2월 19 09:22 tak.h
-rwxrwxrwx. 1 tmax2 tmax2 8480  2월 19 09:43 taks_exe
-rw-rw-rw-. 1 tmax2 tmax2   71  2월 19 09:26 test1.c
-rw-rw-rw-. 1 tmax2 tmax2 1496  2월 19 09:42 test1.o
-rw-rw-rw-. 1 tmax2 tmax2   65  2월 19 09:28 test2.c
-rw-rw-rw-. 1 tmax2 tmax2 1496  2월 19 09:42 test2.o

make를 실행할경우 object파일과 실행파일이 생성된 모습을 확인할수가 있다. 

tmax2@tak:/home/tmax2/study_make> make clean
rm *.o taks_exe
tmax2@tak:/home/tmax2/study_make>
tmax2@tak:/home/tmax2/study_make>
tmax2@tak:/home/tmax2/study_make> ll
합계 20
-rw-rw-rw-. 1 tmax2 tmax2 232  2월 19 09:43 Makefile
-rw-rw-rw-. 1 tmax2 tmax2  78  2월 19 09:27 main.c
-rw-rw-rw-. 1 tmax2 tmax2  49  2월 19 09:22 tak.h
-rw-rw-rw-. 1 tmax2 tmax2  71  2월 19 09:26 test1.c
-rw-rw-rw-. 1 tmax2 tmax2  65  2월 19 09:28 test2.c

make clean을 실행하였을 경우 산출물 (object파일과 실행파일)이 제거되고 c소스파일들이 존재하는 모습을 확인할수가 있다. 


Makefile 매크로 사용해보기 
매크로를 사용하면 나중에 실행파일의 명명이 바뀌었을때 혹은 컴파일 규칙이 바뀌엇을때 수정하기 용이하다. 
사용법은 간단하다. 

매크로 사용 예시 

CC = gcc
CFLAGS = -W -Wall
TARGET = taks_exe

$(TARGET) : test1.o  test2.o main.o
        $(CC) $(CFLAGS) -o $(TARGET) test1.o test2.o main.o
test1.o:test1.c
        $(CC) $(CFLAGS) -c -o test1.o test1.c
test2.o :test2.c
        $(CC) $(CFLAGS) -c -o test2.o test2.c
main.o:main.c
        $(CC) $(CFLAGS) -c -o main.o main.c
clean :
        rm *.o taks_exe


CFLAGS에서 -W -WALL이 부분은 세세한 오류라도 모두 출력해주는 옵션이다. 
그럼 Makefile을 위와 같은 스크립트로 바꿔준다.  

> make clean 
> vi Makefile
./taks_exe



tmax2@tak:/home/tmax2/study_make> make
gcc -W -Wall -c -o test1.o test1.c
gcc -W -Wall -c -o test2.o test2.c
gcc -W -Wall -c -o main.o main.c
main.c:2:8: warning: return type of 'main' is not 'int' [-Wmain]
   void main(void){
        ^
main.c: In function 'main':
main.c:5:4: warning: 'return' with a value, in function returning void [enabled by default]
    return 0;
    ^
gcc -W -Wall -o taks_exe test1.o test2.o main.o
tmax2@tak:/home/tmax2/study_make> ls
Makefile  main.c  main.o  tak.h  taks_exe  test1.c  test1.o  test2.c  test2.o



마찬가지로 잘 실행되는 모습이다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31