나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2026-06-09 04:53:26

Make


파일:다른 뜻 아이콘.svg  
#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. 
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 영어 단어 make}}}에 대한 내용은 [[메이크]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[메이크#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[메이크#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.

#!if 리스트 != null
{{{#!if 문서명1 != null
 * {{{#!if 설명1 != null
영어 단어 make: }}}[[메이크]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[메이크#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[메이크#|]] 부분}}}}}}{{{#!if 문서명2 != null
 * {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
 * {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
 * {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
 * {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
 * {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
 * {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
 * {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
 * {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
 * {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}

GNU Project
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: -6px -1px -10px;"
<colbgcolor=#a32d2a><colcolor=#fff,#fff> 관련 문서 GNU · 자유 소프트웨어 재단 · 리처드 스톨먼
소프트웨어 Bash · GNOME · GNU Emacs · GNU IceCat · GNU/Linux · GNUnet · GNU Octave · GNU Screen · groff · GRUB · Midnight Commander · nano · R · Texinfo
<bgcolor=#a32d2a><color#fff> 유틸리티 coreutils(fileutils · textutils · shellutils) · GNU Grep · GnuPG · GNU Tar
<bgcolor=#a32d2a><color#fff> 개발자 도구 Autotools(autoconf · automake) · binutils(BFD · as · ld · gold · gdb) · GCC · glibc · GNU Make
라이선스 GNU 범용 공개 라이선스 · GNU 약소 범용 공개 라이선스 · GNU Affero 범용 공개 라이선스
기타 GNU Unifont
취소선: 독립한 프로젝트
}}}}}}}}} ||
1. 개요2. 필요성3. 사용 예제4. 파생 소프트웨어5. 빌드
5.1. 예시
6. 관련 문서7. 외부 링크

1. 개요

1976년 Stuart Feldman이 개발한 빌드 자동화 소프트웨어. Makefile이라고 불리는 설정 파일을 읽어 소스 코드라이브러리로부터 실행파일을 생성하는 작업을 자동화한다.

처음에는 Unix 계열 운영체제를 대상으로 만들어졌으며, 주로 C언어 컴파일러인 CC와 함께 작동한다.

2. 필요성

CLI 환경에서 컴파일을 할 경우, 소스 코드 파일의 수가 많아지면 입력해야 할 텍스트의 양이 늘어난다.

예를 들어 C언어로 3개의 소스 코드 파일 test.h, test.c, main.c로 구성된 프로그램을 빌드한다고 가정한다. (test.cmain.c 파일은 각각 test.h를 포함한다.)

이 경우 유닉스에서 C언어 컴파일러를 이용하여 최종 출력물인 main 바이너리 파일을 만들기 위해서 입력해야 하는 커맨드는 아래와 같다.
#!syntax shell
cc -c test.c
cc -c main.c
cc -o main main.o test.o
-c는 소스 파일을 컴파일하여 .o 형식의 목적 파일로 만드는 옵션이고, -o는 목적 파일을 링킹하여 하나의 실행 파일로 만드는 옵션이다.[1] 즉, 이 커맨드는 test.o 파일과 main.o 파일을 생성한 후 그 파일들을 링킹하여 main이라는 실행 파일로 출력하라는 뜻이다. 고작 파일 세 개 컴파일하는 데 비슷한 문장을 여러 번 입력해야 하니 참으로 귀찮은 일이 아닐 수 없다. 이러한 빌드 과정을 자동화하기 위해 나온 소프트웨어가 바로 Make이다.

3. 사용 예제

위에서 예로 든 세 개의 파일이 아래와 같이 작성되었다고 해 보자.
#!syntax cpp
//========= test.h =========//
#ifndef __TEST_H__
#define __TEST_H__

void TestFunc();

#endif

#!syntax cpp
//========= test.c =========//
#include <stdio.h>
#include "test.h"

void TestFunc() {
    printf("TestFunc()\n");
}

#!syntax cpp
//========= main.c =========//
#include <stdio.h>
#include "test.h"

int main() {
    printf("main()\n");
    TestFunc();

    return 0;
}

이 파일들을 하나로 묶어 main 바이너리 파일을 한 번에 생성하려면 Make가 필요한데, Make는 해당 폴더 내의 Makefile이라는 빌드 자동화 스크립트 파일을 탐색하게 된다. 이는 VC++ 컴파일러에 쓰이는 .vcxproj 파일과 동일한 역할이라고 할 수 있다. 소스 파일이 있는 폴더 안에 아래와 같은 코드를 입력한 후 Makefile이라는 이름으로 저장하자.
main: test.o main.o
	gcc -std=c11 -g -o main test.o main.o

test.o: test.h test.c
	gcc -std=c11 -g -c test.c

main.o: test.h main.c
	gcc -std=c11 -g -c main.c

-std=c11C언어의 표준을 C11로 설정하고, -g는 디버깅이 가능하도록 컴파일 시 디버깅 정보를 삽입하는 명령이다. 보면 알겠지만 위에서 보인 컴파일 커맨드 라인 한 줄 한 줄을 그대로 옮겨 놓았을 뿐이다. 그리고 목적 파일의 이름은 헤더/소스 파일의 이름과 같아야 인식이 된다. Makefile에서는 이를 Rule Block이라고 한다. 단, Makefile을 작성할 때는 몇 가지 원칙이 있는데 간단한 것만 소개하면 다음과 같다. [Command]
}}}* Target은 빌드할 대상의 이름, Dependency는 빌드하기 위해 필요한 헤더/소스 파일들(의존성), Command는 빌드 커맨드를 의미한다. 그리고 Command 문장의 앞 부분은 반드시 Tab으로 들여쓰기를 해야 한다.

그러나 이것도 역시 만족스럽지 않다. 빌드해야 할 파일이 늘어날 경우 입력해야 할 커맨드의 개수가 늘어나면 자동화의 의미가 없다. 아래와 같이 매크로를 사용하면 코드 타이핑 횟수를 줄이고 재사용성을 높일 수 있다.
CC = gcc
CFLAGS = -std=c11 -g

OBJ = main.o test.o
TARGET = main

$(TARGET): $(OBJ)
	$(CC) $(CFLAGS) -o $@ $(OBJ)

all: $(TARGET)

clean:
	rm -f *.o
	rm -f $(TARGET)
#	del /q /s *.exe  # 윈도우 전용

프로그래머마다 조금씩 차이는 있겠지만 대체로 이와 비슷한 형태로 Makefile을 작성한다. CC와 CFLAGS는 Make 자체에 포함된 내장 변수이고, 나머지는 임의로 선언한 사용자 변수이다. 먼저 OBJ에 실행 파일을 만드는 데 필요한 목적 파일을 모두 기술하고, TARGET에는 최종 실행 파일의 명칭을 입력하였다. 그리고 Rule Block의 구조에 맞춰 -o 옵션을 주면, 'make all'을 입력할 시 각각의 소스 파일에 대한 -c 옵션과 목적 파일에 대한 -o 옵션이 컴파일 옵션에 맞춰 자동으로 처리되는 결과를 보여준다. 이때 매크로는 모두 $(...)의 형태로 사용해야 한다.

all에는 Target의 이름을 지정하여, Rule Block이 여러 개일 경우 그것들을 순서대로 한 번에 실행할 수 있다. 여기서는 Rule Block이 한 개이므로 실행 시 그냥 make라 입력해도 무방하다. clean에는 rm -f 명령어[2]를 지정해서 'make clean' 명령을 통해 .o로 끝나는 모든 목적 파일과 Target으로 지정된 실행 파일을 삭제하도록 한다.

이제 터미널 창에서 'make all'을 입력하면 아래와 같은 문장이 출력된다.
gcc -std=c11 -g   -c -o main.o main.c
gcc -std=c11 -g   -c -o test.o test.c
gcc -std=c11 -g -o main main.o test.o
위에서는 기술하지 않았지만, main.o와 test.o를 생성하기 위해 main.c, test.c 파일의 컴파일(-c)이 자동으로 진행되는 것을 볼 수 있다. 빌드 커맨드 명령을 Rule Block마다 하나하나 입력할 필요 없이, 상황에 맞춰 OBJ 또는 TARGET의 값만 바꿔주면 된다. 또한 프로젝트 전체가 아닌 특정 파일, 예를 들어 test.o 파일만 빌드하고 싶다면 'make test.o'를 입력하여 해당 파일만 개별적으로 빌드할 수도 있다.

4. 파생 소프트웨어

5. 빌드

5.1. 예시

\> make -j$(nproc)
$(nproc)는 시스템의 CPU 코어 수에 맞춰 병렬 빌드를 실행하므로 빌드 속도가 빨라진다. 코어 수가 많지 않다면 전통적인 방법대로 단순히 make 명령어만 입력해서 진행할 수도 있다.

6. 관련 문서

7. 외부 링크


[1] 목적 파일 대신 소스 파일이 오면 -c 옵션이 자동으로 먼저 수행된 후 링킹을 한다.[2] 윈도우에서는 del /q /s 명령어로 대체.[3] MSDN - Visual Studio에서 C++ 플랫폼 간 프로젝트 만들기