Make
0. 사전학습
1. Make & Makefile 개요
더보기
Make 프로그램
여러 파일로 구성된 프로젝트에서 복잡하고 반복적인 컴파일 명령을 자동으로 수행해 주는 빌드 자동화 도구입니다.
사용자가 작성한 Makefile을 기반으로 프로젝트를 효율적으로 빌드합니다.
- 자동화: 수동 컴파일 과정 반복 방지
- 증분 빌드: 변경된 파일만 컴파일해서 빌드 시간 단축
- 유지보수 편리: 복잡한 프로젝트 빌드 규칙 명확히 관리
- 플랫폼 독립성: 다양한 OS에서 사용 가능
- 확장성: 복잡한 빌드 과정도 관리 가능 (변수, 조건문, 함수 등 활용)
Makefile 스크립트 문서
Makefile은 일반 텍스트 형식으로 작성된 파일입니다. 여러 소스 파일로 구성된 프로젝트를
Make 프로그램이 컴파일할 때 필요한 명령어들을 정의한 설정 파일입니다.
Make 프로그램은 Makefile에 지정된 방식대로 컴파일 및 링크 작업을 수행합니다.
Makefile 내에는 쉘 명령어(shell commands)를 실행하는 부분이 포함됩니다.
요약
- Make는 빌드 자동화를 위한 도구
- Makefile은 빌드 규칙을 정의한 설정 파일
- 의존성 검사 후 필요한 부분만 빌드 → 효율적 개발환경 조성
- 복잡한 프로젝트일수록 필수적인 도구
2. 단일 소스 코드 빌드
더보기


1. 단일 소스 코드
#include <stdio.h>
// foo() 함수
void foo() {
printf("This is foo()\n");
}
// bar() 함수
void bar() {
printf("This is bar()\n");
}
// main() 함수: 프로그램의 진입점
int main() {
foo();
bar();
return 0;
}
2. 빌드 명령어
gcc test.c // test.c → a.out 생성

- * 기호는 해당 파일이 "실행 가능한 파일(executable)"임을 나타내는 시각적 표시(리눅스 심볼)
- a.out의 .out 은 "기본 출력 실행 파일(auto output file)"을 의미, 확장자 .out이 아님
- ./a.out 실행 명령은, 현재 디렉터리의 a.out 실행
- . 는 현재 디렉터리(Current Directory)를 의미
(절대경로(/home/user/myprogram) 대신 간단히 현재 위치 기준으로 실행파일 위치를 지정) - / 는 유닉스, 리눅스, macOS 등에서 디렉터리(폴더) 경로를 구분하는 문자
- . 는 현재 디렉터리(Current Directory)를 의미
3. gcc 컴파일 옵션: -o
- Output file 출력 파일 이름 지정
- 기본적으로 gcc는 출력 파일을 a.out으로 생성
- -o 옵션을 사용하면 원하는 이름으로 실행파일명 설정 가능
- 링크 포함 실행파일 생성
gcc test.c -o test

3. 분할된 소스코드 빌드
더보기



1. 분할된 소스코드 구조


2. 소스코드
make.zip
0.00MB
// foo.h
#ifndef FOO_H
#define FOO_H
void foo();
#endif
// foo.c
#include <stdio.h>
#include "foo.h"
void foo() {
printf("This is foo()\n");
}
// bar.h
#ifndef BAR_H
#define BAR_H
void bar();
#endif
// bar.c
#include <stdio.h>
#include "bar.h"
void bar() {
printf("This is bar()\n");
}
// main.c
#include "foo.h"
#include "bar.h"
int main() {
foo();
bar();
return 0;
}
3. 빌드 명령어
gcc main.c foo.c bar.c -o program

4. Make 사용해 보기
더보기



1. 문제점
- 파일이 추가될 때 빌드 명령어가 길어짐
gcc main.c foo.c bar.c baz.c qux.c -o program
- 외부 라이브러리 링크 추가 예시
gcc main.c foo.c bar.c baz.c qux.c -o program -lmysqlclient -lpthread
- 특정 파일만 수정했을 때 전체 재컴파일 비효율
개별 컴파일 후 링크 + 라이브러리 링크 예시( 직접 관리하기 번거롭습니다.)
gcc -c foo.c gcc -c bar.c gcc -c baz.c gcc -c qux.c gcc -c main.c gcc foo.o bar.o baz.o qux.o main.o -o program -lmysqlclient -lpthread
2. 해결책
- Makefile 사용
- Makefile을 쓰면
- 변경된 파일만 컴파일
- 라이브러리 링크 옵션 관리
- 긴 명령어 간소화
3. Makefile 스크립트 추가하기
CC = gcc
CFLAGS = -Wall -g
LDFLAGS = -lmysqlclient -lpthread
SRCS = main.c foo.c bar.c #baz.c qux.c
OBJS = $(SRCS:.c=.o)
myprogram: $(OBJS)
$(CC) $(OBJS) -o $@ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) myprogram

- 주의사항
- Makefile 내 명령어(명령을 실행하는 줄) 들은 반드시 탭 문자로 들여쓰기 해야 합니다.
- 스페이스 4개(또는 여러개)로 바꾸면 안 됩니다.
4. Make 사용해 보기
make # makefile 스크립트의 처음 타겟부터 실행
make myprogram # makefile 스크립트의 myprogram 명령 실행 (빌드)
make clean # makefile 스크립트의 clean 명령 실행 (빌드 결과 삭제)

*myprogram 실행파일이 생성됩니다.

*생성된 목적파일과 실행파일을 제거합니다.