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 등에서 디렉터리(폴더) 경로를 구분하는 문자

 

 

 

 

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 실행파일이 생성됩니다.

 

 

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

 

 

 


5. Makefile 만드는 방법 학습하기 ☜