본문 바로가기

그냥 C언어

[C언어] makefile

필요이유 

  • 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