Skip to content
jdeokkim edited this page Apr 26, 2022 · 2 revisions

C 프로그램의 빌드 과정

우리가 C 프로그램을 빌드하는 과정을 한번 생각해보자.

  1. 전처리 (preprocessing): 컴파일러 (compiler)는 먼저 우리가 작성한 소스 파일을 읽고, #include 매크로가 보이면 #include 매크로에 명시된 헤더 파일을 찾아, 소스 코드의 맨 앞에 헤더 파일의 내용을 삽입한다. 또한 컴파일러는 소스 코드에서 #define으로 정의된 부분과 일치하는 곳이 있으면 해당 내용을 모두 변경하고, 나머지 매크로의 처리까지 끝낸 후 수정된 소스 파일을 컴파일링 과정에 사용하게 된다.

  2. 컴파일링 (compiling): 우리가 작성한 각각의 소스 파일은 컴파일러에 의해 CPU가 이해할 수 있는 기계어 (machine instructions)로 변환되어 목적 파일 (object file)에 저장된다. 일반적으로 이 목적 파일의 확장자는 윈도우 (Windows) 환경에서는 .obj, 리눅스 (GNU/Linux) 환경에서는 .o이다.

  3. 링킹 (linking): 컴파일러가 생성한 여러 개의 목적 파일은 링커 (linker)라는 프로그램에 의해 외부 라이브러리 파일 등과 합쳐지고, 실행 파일 또는 라이브러리 파일이 된다.

사실 윈도우 환경에서는 비주얼 스튜디오 (Visual Studio)가 빌드 버튼을 한번만 클릭하면 우리가 작성한 소스 파일을 자동으로 빌드해주기 때문에 저런 내용이 별로 중요하지 않다고 생각할 수도 있지만, 우리가 비주얼 스튜디오가 지원되지 않는 리눅스 환경에서 C 프로그램을 작성해야 한다면 얘기가 달라진다.

우리가 이번 학기 게임 프로젝트를 위해 사용할 통합 개발 환경 (integrated development environment, IDE)은 비주얼 스튜디오 코드 (Visual Studio Code)이다. 우리가 만들 C 프로그램의 소스 파일이 기껏해야 한두개 정도라면 비주얼 스튜디오 코드에서 제공하는 '기본 빌드 작업 구성' 메뉴를 이용해 빌드를 할 수 있겠지만, 게임 프로젝트는 C 표준 라이브러리 이외에도 다양한 오픈 소스 라이브러리를 사용하기 때문에 설정 파일을 수정하는 것이 까다로울 것이다. 또한 우리가 사용하려는 오픈 소스 라이브러리 중에서는 비주얼 스튜디오나 비주얼 스튜디오 코드를 위한 설정 파일이 따로 포함되지 않은 경우도 존재한다. 이럴 때 우리가 사용해야 하는 것이 바로 빌드 시스템 (build system)이라는 소프트웨어이다.

빌드 시스템

빌드 시스템은 정해진 규칙에 따라 우리가 작성한 소스 파일과 외부 라이브러리 파일 등을 찾아 자동으로 컴파일링과 링킹 과정을 수행해주는 소프트웨어를 뜻한다. 우리가 빌드 시스템에 대해 알아야 하는 이유는, 수많은 오픈 소스 소프트웨어가 GNU Make, CMakeMeson 등의 빌드 시스템을 통해 프로그램을 빌드할 수 있는 방법을 제공하기 때문이다. 또한 빌드 시스템을 이용하면 우리가 사용하는 통합 개발 환경이나 운영 체제에 관계없이 그 빌드 시스템이 지원되는 모든 플랫폼에서 빌드 설정 파일을 약간만 수정하여 프로젝트를 바로 빌드할 수 있다.

어차피 우리는 이 템플릿 저장소를 이용하여 프로그래밍 실습을 진행할 것이기 때문에, GNU Make라는 빌드 시스템에 대해서만 간단히 알아보고 넘어가도록 하자. 사실 make라는 프로그램의 원조는 1977년 Stuart Feldman이 유닉스 (UNIX) 운영 체제를 위해 만든 make이며, 리눅스 환경에서 사용되는 GNU Make는 GNU 프로젝트에서 make와 똑같은 기능을 하는 소프트웨어를 오픈 소스로 다시 작성한 것이다.

우리 동아리의 play 저장소에 있는 파일 목록을 보면, Makefile이라는 파일이 있는 것을 확인할 수 있을 것이다. 이것이 바로 make 명령어가 C 프로젝트를 빌드할 때 사용하는 빌드 설정 파일로, 이 파일에는 우리가 만든 프로그램의 소스 파일 위치, 외부 라이브러리의 위치 등이 명시되어 있다.

GNU Make와 Makefile의 작성법에 대해 더 자세히 알고 싶다면, 여기를 참고하자.