대규모 프로그램의 경우에는 헤더, 소스파일, 목적파일, 실행파일의 모든 관계를 기억하고 체계적으로 관리하는것이 필요함.
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 명령어를 실행시키면,
수정된 파일, 수정된 파일과 의존관계인 파일들만 컴파일한다.
(수정하지 않은 파일은 그대로)
'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 |
댓글