해당 교재와 자료는 macOS Catalina 10.15.7 / GNU make 3.81 기준으로 작성되었습니다.
실습 대상 : C 프로그래밍 입문자 실습 목표 :
Makefile
작성법을 익혀 우리의 생산성을 증진 시켜봅시다. 실습 시간 : 약 1시간 실습 자료 : 깃허브 레포지토리 - 해당 레포를 클론하여 실습을 진행합니다.
make
는 소프트웨어 개발을 위해 유닉스 계열 운영 체제에서 주로 사용되는 프로그램 빌드 도구이다. 여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있으며 최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있다.
Makefile은 프로그램을 빌드하기 위해 make
의 문법에 따라 작성하는 문서
먼저 프로그램을 빌드하기 위해 컴파일러가 하는 일을 알아봅시다.
hello.c 소스파일을 → hello 실행파일로 빌드하기 위해 우리는 쉘에 gcc hello.c
명령을 치면 된다는 것을 알고 있습니다. 하지만 실제 이 단순한 명령이 실행파일을 빌드하는데에는 총 네 가지 단계가 존재합니다.
<aside> 💡 전처리 단계 → 컴파일 단계 → 어셈블 단계 → 링크 단계
</aside>
아래 이미지와 함께 각 단계를 설명드리겠습니다.
gcc에서 가장 먼저 작동하는 단계로 전처리기가 소스 파일 내의 전처리기 지시자를 처리합니다. 전처리기 지시자는 #으로 시작하고 세미콜론 없이 개행문자로 종료되는 라인
입니다. 이 단계를 거치면 소스파일 hello.c 로 부터 ****확장 소스파일 hello.i 을 생성합니다.
전처리기 지시자 예시
#include : 지정된 특정 파일의 내용을 해당 지시자가 있는 위치에 삽입
#define : 매크로 함수 및 상수 정의에 사용, 코드 내의 해당 상수를 프로그래머가 정의한 문자열로 대체
일반적으로 우리가 사용하는 컴파일이라는 용어는 넓은 의미로 이 네가지 단계를 모두 포함하는 작업을 뜻하지만 여기서의 컴파일 단계는 좁은 의미로서 컴파일러가 전처리된 파일 hello.i 로 부터 어셈블리어로 된 파일 hello.s 를 생성합니다.
어셈블리어 파일 hello.s 를 기계어로 된 오브젝트 파일 hello.o 로 변환합니다.
오브젝트 파일은 사용한 라이브러리 함수(wirte, printf 등)에 해당하는 코드가 없기 때문에 실행될 수 없습니다. 또한 여러 파일로 이루어진 프로그램의 경우에도 파일간의 연결이 이뤄지지 않아 실행될 수 없습니다. 링크 단계는 라이브러리 함수와 오브젝트 파일들을 연결해서 실행 가능한 파일을 생성합니다. hello.o → hello