문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 Make (문단 편집) == 사용 예제 == 위에서 예로 든 세 개의 파일이 아래와 같이 작성되었다고 해 보자. {{{#!syntax cpp //========= test.h =========// #ifndef __TEST_H__ #define __TEST_H__ void TestFunc(); #endif }}} {{{#!syntax cpp //========= test.c =========// #include #include "test.h" void TestFunc() { printf("TestFunc()\n"); } }}} {{{#!syntax cpp //========= main.c =========// #include #include "test.h" int main() { printf("main()\n"); TestFunc(); return 0; } }}} 이 파일들을 하나로 묶어 main 바이너리 파일을 한 번에 생성하려면 Make가 필요한데, Make는 해당 폴더 내의 Makefile이라는 빌드 자동화 스크립트 파일을 탐색하게 된다. 이는 [[Visual Studio|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=c11은 [[C언어]]의 표준을 C11로 설정하고, -g는 디버깅이 가능하도록 컴파일 시 디버깅 정보를 삽입하는 명령이다. 보면 알겠지만 위에서 보인 컴파일 커맨드 라인 한 줄 한 줄을 그대로 옮겨 놓았을 뿐이다. 그리고 목적 파일의 이름은 헤더/소스 파일의 이름과 같아야 인식이 된다. Makefile에서는 이를 '''Rule Block'''이라고 한다. 단, Makefile을 작성할 때는 몇 가지 원칙이 있는데 간단한 것만 소개하면 다음과 같다. * 최종 출력물의 링킹을 명령하는 라인(main: test.o main.o)은 맨 위에 와야 한다. 만약 test.o: test.h test.c 라인이 맨 위에 오면 test.o 파일만 생성하고 끝나 버린다. * 하나의 Rule Block은 다음과 같은 구조를 지켜야 한다. '''[Target]: [Dependency]''' '''[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 # 윈도우 전용 }}} * CC: 컴파일을 수행할 C 컴파일러의 이름. C++ 컴파일러를 사용할 경우 CC를 CXX로 변경한다. * CFLAGS: 컴파일 옵션. C++ 컴파일러는 CXXFLAGS를 사용한다. * $@: 해당 Rule Block의 Target을 나타내는 자동 변수 프로그래머마다 조금씩 차이는 있겠지만 대체로 이와 비슷한 형태로 Makefile을 작성한다. CC와 CFLAGS는 Make 자체에 포함된 내장 변수이고, 나머지는 임의로 선언한 사용자 변수이다. 먼저 OBJ에 실행 파일을 만드는 데 필요한 목적 파일을 모두 기술하고, TARGET에는 최종 실행 파일의 명칭을 입력하였다. 그리고 Rule Block의 구조에 맞춰 -o 옵션을 주면, 'make all'을 입력할 시 각각의 소스 파일에 대한 -c 옵션과 목적 파일에 대한 -o 옵션이 컴파일 옵션에 맞춰 자동으로 처리되는 결과를 보여준다. 이 때 매크로는 모두 $(...)의 형태로 사용해야 한다. all에는 Target의 이름을 지정하여, Rule Block이 여러 개일 경우 그것들을 순서대로 한 번에 실행할 수 있다. 여기서는 Rule Block이 한 개이므로 실행 시 그냥 make라 입력해도 무방하다. clean에는 rm -f 명령어[* 윈도우에서는 del /q /s 명령어로 대체.]를 지정해서 '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'를 입력하여 해당 파일만 개별적으로 빌드할 수도 있다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기