본문 바로가기
2022-2/시스템 프로그래밍

make 시스템

by 철없는민물장어 2022. 10. 11.
728x90

대규모 프로그램의 경우에는 헤더, 소스파일, 목적파일, 실행파일의 모든 관계를 기억하고 체계적으로 관리하는것이 필요함.

make 시스템을 이용하여 효과적으로 작업.

 

Makefile의 구성 형식

대상리스트: 의존리스트

(tab)명령리스트

 

예시)

main: main.o copy.o

    gcc -o main main.o copy.o

main.o: main.c copy.h

    gcc -c main.c

copy.o: copy.c copy.h

    gcc -c copy.c

 

make 실행

$ make 혹은 $ make main

 


여기서부터 다시 씀


파일이 많아지면 컴파일 하는데 시간도 오래걸리고, 파일 관리하기가 힘들어지는데,

make 시스템을 이용하면 파일관리, 컴파일을 효과적으로 할 수 있다.

 

$ vi Makefile 

해서 makefile을 만들어보자.

 

all: app.out

app.out: main.o kor.o
	gcc -o app.out main.o kor.o

main.o:
	gcc -c main.c
    
kor.o:
	gcc -c kor.c

 

all옵션이 없는 경우 제일 첫 번째 타겟만 실행시키고 끝나기 때문에 all: app.out을 해줬다

(여기선 안해도 똑같은 결과긴 하지만)

 

여기서 gcc컴파일러를 썼는데, 나중에 다른 컴파일러로 바꾸고싶으면?.. 하나하나 다 바꿔야하나?..

그러지 말고 변수를 사용하자.

 

CC = gcc

all: app.out

app.out: main.o kor.o
	$(CC) -o app.out main.o kor.o

main.o:
	$(CC) -c main.c
    
kor.o:
	$(CC) -c kor.c

 

 

타겟도 변수로 바꿔보자.

CC = gcc
TARGET = app.out

all: $(TARGET)

$(TARGET): main.o kor.o
	$(CC) -o $(TARGET) main.o kor.o

main.o:
	$(CC) -c main.c
    
kor.o:
	$(CC) -c kor.c

 

의존파일들도 바꿔보자.

CC = gcc
TARGET = app.out
OBJS = main.o kor.o

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) -o $(TARGET) $(OBJS)

main.o:
	$(CC) -c main.c
    
kor.o:
	$(CC) -c kor.c

 

근데 타겟은 $@, 의존파일은 $^으로 표시할 수도 있다.

CC = gcc
TARGET = app.out
OBJS = main.o kor.o

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) -o $@ $^

main.o:
	$(CC) -c main.c
    
kor.o:
	$(CC) -c kor.c

근데 .c파일을 목적파일 .o로 바꾸는 저 코드들...

바꿔주고싶다.

바꿔보자

CC = gcc
TARGET = app.out
OBJS = main.o kor.o

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) -o $@ $^

.c.o:
	$(CC) -c -o $@ $<

 

근데 만약 컴파일할 때, 실행파일 생성할 때 옵션을 주고싶다면 어떡하지?

또 따로 변수를 만들어 넣어주면 된다.

CC = gcc
TARGET = app.out
OBJS = main.o kor.o
CFLAGS = -Wall
LDFLAGS = -lc

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^

.c.o:
	$(CC) $(CFLAGS) -c -o $@ $<

CFLAGS는 컴파일 옵션

LDFLAGS는 라이브러리가 들어간다.

 

마지막으로 Label도 한개 추가해보자.

CC = gcc
TARGET = app.out
OBJS = main.o kor.o
CFLAGS = -Wall
LDFLAGS = -lc

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^

.c.o:
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -f $(OBJS)

목적파일들을 삭제하는 clean label을 하나 추가해보았다.

 

$make => 컴파일 동작

$make clean => clean label 동작

 

이렇게 만들어놓고 make 명령어를 실행시키면,

수정된 파일, 수정된 파일과 의존관계인 파일들만 컴파일한다.

(수정하지 않은 파일은 그대로)

728x90

'2022-2 > 시스템 프로그래밍' 카테고리의 다른 글

4장 파일 입출력  (0) 2022.10.30
gdb 디버거  (3) 2022.10.14
3장 - C프로그래밍 환경  (0) 2022.10.07
2장 - 리눅스 사용  (2) 2022.10.07
1장 - 유닉스 리눅스 소개  (0) 2022.10.07

댓글