필요이유
- 1. 반복되는 컴파일 작업이 오래 걸림
- 2. 수정된 파일만 컴파일 가능
- 3. 대규모 프로젝트 ,공통 프로젝트에 필요
구조
TARGET : DEPENDENCY
command -> 탭으로 구분
여러 변수 사용해서 반복적으로 사용하지 않고 유연하게 사용할 수 있다
Makefile
Makefile은 컴파일과 빌드 과정을 자동화하는 파일
gcc main.c -o main 같은 명령어를 매번 직접 입력하지 않고, 한 번 작성해두면 make 명령어 한 줄로 빌드가 가능
Makefile의 주요 변수와 역할
INSDIR (Installation Directory - 설치 디렉터리)
- 프로그램을 최종적으로 어디에 복사할지 지정하는 변수
- 보통 /usr/local/bin 같은 곳에 프로그램을 배포할 때 사용
- 예시:
- make install 실행 시, 프로그램이 이 위치에 복사
INSDIR = /usr/local/bin
TARGET (최종 실행 파일 이름)
- 최종적으로 만들어질 실행 파일 이름을 지정
TARGET = my_program
- 이 경우 make를 실행하면 my_program이라는 실행 파일이 만들어짐
CFLAGS (컴파일 옵션)
- C 컴파일러(gcc)에 전달할 옵션을 지정
CFLAGS = -Wall -g -O2
- -Wall → 모든 일반적인 경고 메시지를 표시
- -g → 디버깅 정보를 포함 (GDB 디버깅 가능)
- -O2 → 컴파일러 최적화 옵션
LIBLIST (링크할 라이브러리 목록)
- 프로그램이 실행될 때 필요한 라이브러리를 지정
LIBLIST = -lm -lpthread
- -lm → 수학 라이브러리 (math.h 사용 시 필요)
- -lpthread → 멀티스레드 라이브러리 (pthread.h 사용 시 필요)
LIBS (라이브러리 파일 경로)
특정 디렉터리에 있는 라이브러리를 사용하고 싶을 때 사용
LIBS = -L/usr/local/lib -lcustomlib
- -L/usr/local/lib → /usr/local/lib 디렉터리에서 라이브러리를 찾음
- -lcustomlib → libcustomlib.a 또는 libcustomlib.so를 링크
SRCS (소스 파일 목록)
- 컴파일할 C 파일 목록
SRCS = main.c utils.c
- make 실행 시 main.c와 utils.c를 컴파일
OBJS (오브젝트 파일 목록)
- .c 파일을 컴파일해서 .o 파일로 변환한 목록
OBJS = main.o utils.o // OBJS = $(SRCS:.c=.o)
- make 실행 시 main.c → main.o, utils.c → utils.o로 변환됨
- $(SRCS:.c=.o)를 사용하면 자동 변환 가능
Makefile에서 자주 사용되는 규칙 (Targets)
Makefile에서 특정 작업을 수행하는 명령어를 **타겟(Target)**이라함
① all (전체 빌드)
- make 실행 시 기본적으로 수행되는 타겟
all: $(TARGET)
② install (설치)
- make install을 실행하면 프로그램을 특정 위치에 복사하는 역할
install: cp $(TARGET) $(INSDIR)
- 실행하면 my_program이 /usr/local/bin으로 복사
③ $(TARGET) (실행 파일 빌드)
- make를 실행하면 C 소스 파일을 오브젝트 파일로 변환한 후 실행 파일을 생성
$(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBLIST)
- $@ → $(TARGET)을 의미
④ clean (컴파일된 파일 정리)
- make clean을 실행하면 .o 파일(오브젝트 파일)들을 삭제
clean: rm -f $(OBJS)
- .o 파일만 삭제하고 실행 파일(my_program)은 삭제하지 않음
⑤ cleanall (전체 정리)
- make cleanall을 실행하면 .o 파일과 실행 파일을 모두 삭제
cleanall: clean rm -f $(TARGET)
- .o 파일 + 실행 파일을 삭제
⑥ depend (의존성 관리)
- make depend를 실행하면, 변경된 소스 파일만 다시 빌드하도록 설정
depend: gcc -MM $(SRCS) > .depend
- -MM 옵션은 main.c가 사용하는 모든 #include 파일을 분석하여 의존성을 기록함
4. Makefile 예제
# 변수 정의
CC = gcc # 사용할 컴파일러
CFLAGS = -Wall -g -O2 # 컴파일 옵션
INSDIR = /usr/local/bin # 설치할 디렉터리
TARGET = my_program # 실행 파일 이름
SRCS = main.c utils.c # 소스 파일 목록
OBJS = $(SRCS:.c=.o) # .c -> .o 변환
# 기본 타겟 (전체 빌드)
all: $(TARGET)
# 실행 파일 빌드
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS)
# 개별 파일 컴파일
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 설치
install:
cp $(TARGET) $(INSDIR)
# 정리
clean:
rm -f $(OBJS)
cleanall: clean
rm -f $(TARGET)
5. Makefile 사용 예시
make # 실행 파일 빌드 (main.c, utils.c → my_program)
make clean # .o 파일 삭제
make install # 실행 파일을 /usr/local/bin 에 복사
make cleanall # .o 파일 + 실행 파일 삭제
결론
- Makefile은 C 프로그램을 쉽게 빌드할 수 있도록 도와줌
- make 한 줄이면 gcc 여러 줄을 입력하는 번거로움을 해결 가능
- make clean 같은 명령어로 불필요한 파일을 쉽게 삭제 가능
'그냥 C언어' 카테고리의 다른 글
[C언어] gettimeofday, timeval, tm , localtime_r (0) | 2025.03.05 |
---|