Makefile - 1. Makefile 기본 개념 (1-2. Makefile의 동작 방식)
2025. 3. 11. 18:54ㆍ개발/개발도구와 환경
📌 1-2. Makefile의 동작 방식
Makefile은 소스 코드의 컴파일을 자동화하기 위한 파일로, 종속성(Dependency) 관리를 통해 효율적으로 빌드를 수행합니다.
이를 이해하기 위해 종속성 개념, Makefile의 실행 흐름, .o 파일과 실행 파일의 관계를 자세히 살펴보겠습니다.
1. 종속성(Dependency) 개념
📌 1-1. 종속성이란?
Makefile에서 종속성(Dependency)은 어떤 파일이 다른 파일을 생성하는 데 필요한 경우를 의미합니다.
즉, 특정 파일이 변경되면, 이를 의존하는 다른 파일도 다시 빌드해야 합니다.
📌 1-2. 종속성의 원리
- A 파일이 변경되면, A에 의존하는 B도 자동으로 다시 생성됨.
- 이를 통해 불필요한 전체 재컴파일을 방지하고 빌드 시간을 단축할 수 있음.
📌 1-3. 예제
다음과 같은 Makefile이 있다고 가정해 보겠습니다.
myprogram: main.o utils.o
gcc -o myprogram main.o utils.o
- myprogram 실행 파일을 만들려면 main.o와 utils.o가 필요함.
- main.o 또는 utils.o가 변경되면, myprogram을 다시 빌드해야 함.
🔹 확장된 예제
main.o: main.c utils.h
gcc -c main.c
utils.o: utils.c utils.h
gcc -c utils.c
- main.o는 main.c와 utils.h에 의존함.
- utils.o는 utils.c와 utils.h에 의존함.
- utils.h가 수정되면 main.o와 utils.o 모두 다시 빌드됨.
2. Makefile의 기본 실행 흐름
📌 2-1. Make 실행 과정
Makefile을 실행하면 다음과 같은 단계로 진행됩니다.
1️⃣ Makefile 찾기
- make 명령어를 입력하면 현재 디렉토리에서 Makefile 또는 makefile을 찾음.
2️⃣ 첫 번째 목표(Target) 확인
- Makefile의 첫 번째 목표(Target)을 기본 실행 대상으로 설정.
- 보통 all을 첫 번째 타겟으로 설정하여 모든 빌드를 수행하도록 함.
3️⃣ 종속성 검사 (Dependency Check)
- 종속성이 있는 파일(소스 코드, 헤더 파일 등)이 최신인지 확인.
- 최신이 아니면 해당 파일을 새롭게 컴파일.
4️⃣ 명령어 실행 (Command Execution)
- 대상(Target)을 만들기 위해 명령어(Command)를 실행.
- make는 기본적으로 sh(Bash Shell)에서 실행됨.
📌 2-2. 실행 흐름 예제
다음과 같은 Makefile을 살펴보겠습니다.
CC = gcc
CFLAGS = -Wall -g
all: myprogram
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o myprogram main.o utils.o
main.o: main.c utils.h
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c utils.h
$(CC) $(CFLAGS) -c utils.c
clean:
rm -f *.o myprogram
📌 실행 과정
make
📌 make 실행 시 내부 동작 과정:
- all 목표를 실행 → myprogram을 생성해야 함.
- myprogram을 만들려면 main.o와 utils.o가 필요함.
- main.o와 utils.o를 각각 생성해야 함.
- main.c 또는 utils.h가 변경되었는지 확인하고, 변경되었다면 main.o를 다시 빌드.
- utils.c 또는 utils.h가 변경되었는지 확인하고, 변경되었다면 utils.o를 다시 빌드.
- gcc -o myprogram main.o utils.o 실행하여 최종 실행 파일 myprogram을 생성.
3. .o 파일과 실행 파일의 관계
📌 3-1. .o 파일(Object File)이란?
- .o 파일(오브젝트 파일, Object File)은 컴파일된 중간 결과물입니다.
- 실행 파일을 만들기 전에 각각의 .c 파일을 개별적으로 컴파일하여 .o 파일을 생성.
- .o 파일은 기계어 코드가 포함되어 있지만 아직 실행할 수 없음.
📌 예제
gcc -c main.c # main.c → main.o
gcc -c utils.c # utils.c → utils.o
📌 3-2. 오브젝트 파일과 실행 파일 관계
- .c 파일 → 컴파일 → .o 파일 (Object File)
- 여러 개의 .o 파일 → 링킹(Linking) → 실행 파일(Executable File)
📌 Makefile에서 오브젝트 파일을 활용하는 이유
- 변경된 파일만 다시 컴파일하여 빌드 속도를 최적화할 수 있음.
- 큰 프로젝트에서 소스 코드의 재사용성을 높일 수 있음.
📌 예제
CC = gcc
CFLAGS = -Wall -g
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o myprogram main.o utils.o
이 Makefile을 실행하면:
- main.c가 변경되었으면 main.o만 다시 빌드.
- utils.c가 변경되었으면 utils.o만 다시 빌드.
- gcc -o myprogram main.o utils.o를 실행하여 최종 실행 파일을 생성.
📌 1-2. Makefile의 동작 방식 요약 정리
개념 | 설명 |
종속성(Dependency) | 특정 파일이 다른 파일에 의해 영향을 받는 관계 |
목표(Target) | 최종적으로 만들고자 하는 파일 (예: 실행 파일) |
의존성(Dependencies) | 목표를 생성하는 데 필요한 파일들 |
명령(Command) | 목표를 만들기 위해 실행하는 명령어 |
Make 실행 과정 | Makefile을 읽고, 종속성을 검사한 후, 필요한 부분만 컴파일 |
.o 파일(Object File) | 개별 .c 파일을 컴파일한 중간 결과물 |
링킹(Linking) | 여러 개의 .o 파일을 결합하여 실행 파일을 생성 |
증분 빌드(Incremental Build) | 변경된 파일만 다시 빌드하여 시간을 절약 |
'개발 > 개발도구와 환경' 카테고리의 다른 글
Makefile - 2. Makefile의 기본 문법 (2-1. 변수 (Variables)) (0) | 2025.03.11 |
---|---|
Makefile - 1. Makefile 기본 개념 (1-3. 기본적인 Makefile 구조) (0) | 2025.03.11 |
Makefile - 1. Makefile 기본 개념 (1-1. Makefile이란?) (0) | 2025.03.11 |
Makefile 기본 사용법 (0) | 2024.08.07 |
Jupyter Notebook 기본 사용법 (0) | 2024.07.30 |