gcc 컴파일러 명령어로 매번 프로그램을 실행시킬 수 있지만,
매번 많은 양의 파일들을 직접 터미널에서 gcc 컴파일러 명령어로 칠 수 없을거다.
그래서 Makefile을 만들어서 프로그램을 작동 시킬 수 있도록 할 것이다.
$ tree
├── Makefile
├── README.md
├── obj
│ ├── main.o
│ ├── stack.o
│ └── test.o
├── src
│ ├── Makefile
│ ├── main
│ ├── main.c
│ ├── stack.c
│ ├── stack.h
│ └── test.c
gcc 컴파일러로 main 실행파일과, main.o, stack.o, test.o 이렇게 세가지 목적파일을 main.c, stack.c, test.c 파일을 이용해서 만들 수 있다.
Makefile
.PHONY: clean
# 목적파일을 따로 폴더에 넣어주기 위해 경로를 설정
OBJ_DIR = /home/ubuntu/minpic/rbtree-lab/obj
CC = gcc
# 목적파일의 경로를 찾을 수 있도록 설정
OBJS = $(OBJ_DIR)/stack.o $(OBJ_DIR)/test.o $(OBJ_DIR)/main.o
# 만들어낼 실행파일 이름
TARGET = main
$(TARGET) : $(OBJS)
$(CC) $(OBJS) -o $(TARGET)
$(OBJ_DIR)stack.o : stack.c
$(CC) -c -o $(OBJ_DIR)/stack.o stack.c
$(OBJ_DIR)test.o : test.c
$(CC) -c -o $(OBJ_DIR)/test.o test.c
$(OBJ_DIR)main.o : main.c
$(CC) -c -o $(OBJ_DIR)/main.o main.c
clean :
rm $(OBJS) $(TARGET)
이렇게 만들 수 있다. 그런데 조금 더 간결하고 보기 좋게 작성도 가능하다.
OBJ_DIR = /home/ubuntu/minpic/rbtree-lab/obj
CC = gcc
# addprefix 함수로 각각의 목적파일의 경로를 OBJ_DIR에서 찾을수 있도록
OBJS = $(addprefix $(OBJ_DIR)/, stack.o test.o main.o)
TARGET = main
$(TARGET): $(OBJS)
$(CC) $(OBJS) -o $(TARGET)
$(OBJ_DIR)/%.o: %.c
$(CC) -c -o $@ $<