null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
Makefile 기초 (Makefile Basics)
#c
#c-lang
#intermediate
#multi-file
#makefile
@devpc
|
2026-03-29 12:57:40
|
GET /api/v1/nodes/60?nv=2
History:
v2 (2026-03-29) (Latest)
v1 (2026-03-29)
0
Views
5
Calls
# Makefile 기초 (Makefile Basics) ## Makefile이란? 여러 파일로 구성된 프로젝트를 **자동으로 빌드**하기 위한 규칙 파일입니다. `make` 명령으로 실행하며, 변경된 파일만 재컴파일하여 빌드 시간을 줄입니다. --- ## 기본 규칙 구조 ```makefile 타겟(target): 의존성(prerequisites) 명령(recipe) ← 반드시 탭(Tab)으로 들여쓰기! ``` > ⚠️ 명령 앞에는 **스페이스가 아닌 탭(Tab)** 이어야 합니다. --- ## 첫 번째 Makefile ```makefile # 프로젝트: main.c student.c utils.c → program program: main.o student.o utils.o gcc main.o student.o utils.o -o program main.o: main.c student.h gcc -c main.c -o main.o student.o: student.c student.h gcc -c student.c -o student.o utils.o: utils.c utils.h gcc -c utils.c -o utils.o clean: rm -f *.o program ``` **실행:** ```bash make # 기본 타겟(첫 번째 타겟) 빌드 make clean # 빌드 결과물 삭제 make student.o # 특정 타겟만 빌드 ``` --- ## 변수 사용 ```makefile CC = gcc CFLAGS = -Wall -Wextra -std=c11 -g TARGET = program SRCS = main.c student.c utils.c OBJS = $(SRCS:.c=.o) # .c → .o 치환: main.o student.o utils.o $(TARGET): $(OBJS) $(CC) $(OBJS) -o $(TARGET) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(TARGET) ``` **주요 변수:** | 변수 | 의미 | |------|------| | `CC` | C 컴파일러 (기본값: `cc`) | | `CFLAGS` | 컴파일 옵션 | | `LDFLAGS` | 링크 옵션 | | `LDLIBS` | 링크 라이브러리 (`-lm` 등) | --- ## 자동 변수 ```makefile %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # ^^ ^^ # $< $@ ``` | 자동 변수 | 의미 | |-----------|------| | `$@` | 타겟 이름 (`%.o`) | | `$<` | 첫 번째 의존성 (`%.c`) | | `$^` | 모든 의존성 | | `$*` | 패턴의 stem (`%`에 해당하는 부분) | --- ## 패턴 규칙 (Pattern Rule) 모든 `.c` 파일을 `.o`로 컴파일하는 공통 규칙을 한 줄로 정의합니다. ```makefile %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` --- ## .PHONY — 파일이 아닌 타겟 `clean`, `all` 등은 실제 파일이 아니므로 `.PHONY`로 선언합니다. ```makefile .PHONY: all clean rebuild all: $(TARGET) clean: rm -f $(OBJS) $(TARGET) rebuild: clean all ``` > `clean`이라는 이름의 파일이 존재해도 `make clean`이 올바르게 동작합니다. --- ## 완전한 Makefile 예시 ```makefile # ===== 설정 ===== CC = gcc CFLAGS = -Wall -Wextra -std=c11 -g TARGET = student_manager SRCDIR = src OBJDIR = build SRCS = $(wildcard $(SRCDIR)/*.c) OBJS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SRCS)) # ===== 기본 타겟 ===== .PHONY: all clean debug release all: $(TARGET) # 실행 파일 생성 $(TARGET): $(OBJS) $(CC) $(OBJS) -o $@ @echo "✅ 빌드 완료: $(TARGET)" # 오브젝트 파일 생성 (빌드 디렉터리 자동 생성) $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR) $(CC) $(CFLAGS) -c $< -o $@ $(OBJDIR): mkdir -p $(OBJDIR) # ===== 유틸리티 타겟 ===== clean: rm -rf $(OBJDIR) $(TARGET) @echo "🧹 정리 완료" debug: CFLAGS += -DDEBUG -O0 debug: all release: CFLAGS += -O2 -DNDEBUG release: all run: all ./$(TARGET) ``` **사용법:** ```bash make # 기본 빌드 make debug # 디버그 빌드 (-DDEBUG -O0) make release # 릴리즈 빌드 (-O2) make run # 빌드 후 실행 make clean # 빌드 결과물 삭제 ``` --- ## 의존성 자동 생성 헤더 파일이 변경되어도 올바르게 재빌드하려면 의존성 파일(`.d`)을 자동 생성합니다. ```makefile DEPFLAGS = -MMD -MP DEPS = $(OBJS:.o=.d) $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR) $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ -include $(DEPS) # 의존성 파일 포함 (없어도 오류 안 냄) ``` --- ## 정리 | 개념 | 설명 | |------|------| | 타겟 | 빌드할 파일 이름 | | 의존성 | 타겟 생성에 필요한 파일 | | 레시피 | 실행할 셸 명령 (탭으로 시작) | | `%.o: %.c` | 패턴 규칙 | | `$@`, `$<` | 자동 변수 | | `.PHONY` | 파일이 아닌 타겟 선언 | | `wildcard` | 파일 목록 자동 수집 | ---
// COMMENTS
ON THIS PAGE