C 프로그램 컴파일 과정

프로그래밍 세계에서 모든 것은 소스 코드로 시작됩니다. 소스 코드는 프로그래밍 언어로 작성된 여러 파일로 구성된 코드 베이스라고도 합니다. 기계가 아닌 사람이 이해하는 C 프로그래밍 언어. C 소스 코드는 기계에서 실행될 수 있도록 기계 수준 명령어로 컴파일됩니다. 이 블로그에서는 컴파일된 C 출력을 얻는 단계를 살펴보고 소스 코드를 바이너리로 변환하는 C 프로그램 컴파일 프로세스를 배웁니다.

C 프로그램 컴파일 파이프라인



일반적으로 C 프로그램 컴파일 프로세스 파일은 몇 초가 걸리지만 이 짧은 시간 동안 c 소스 코드가 파이프라인에 들어가고 많은 개별 구성 요소가 작업을 수행합니다.

계속 진행하기 전에 알아야 할 두 가지 규칙이 있습니다.

C 프로그램 컴파일 규칙



*소스 파일만 컴파일됩니다.
*각 파일은 별도로 컴파일됩니다.
C 프로그램 컴파일 파이프라인의 구성 요소는 다음과 같습니다.

1. 전처리기
2.편집
3.조립
4. 링커
컴파일 파이프라인의 각 구성 요소는 이전 구성 요소의 특정 입력을 받아들이고 C 프로그램 컴파일 파이프라인의 다음 구성 요소에 대한 특정 출력을 생성합니다.

이 프로세스는 컴파일 파이프라인의 마지막 구성 요소가 필요한 출력 파일, 즉 바이너리 파일을 생성할 때까지 계속됩니다.

컴파일 파이프라인에 대해 알아야 할 한 가지는 소스 파일이 모든 컴파일 파이프라인 구성 요소를 성공적으로 통과하는 경우에만 출력을 생성한다는 것입니다. 구성 요소 중 하나의 작은 오류라도 컴파일 또는 연결 오류로 이어질 수 있으며 오류 메시지가 표시됩니다.

1단계 – 전처리



C 프로그램 컴파일 파이프라인의 첫 번째 단계는 전처리입니다. 소스 파일은 여러 헤더 파일로 구성되며 이러한 파일은 컴파일이 시작되기 전에 전처리기에 의해 C 코드의 본문에 포함됩니다.

이 전처리된 코드를 번역 단위(Compilation Unit)라고 합니다. 번역 단위는 전처리기에 의해 생성된 C 코드의 단일 논리 단위이며 컴파일러에 제공할 준비가 되어 있습니다.

이론은 충분합니다. 실제 살펴보겠습니다.

GCC에서 전처리된 코드 추출



또한 컴파일 파이프라인의 모든 구성 요소에서 얻은 파일을 살펴볼 수도 있습니다. C 컴파일러에게 번역 단위를 더 이상 컴파일하지 않고 덤프하도록 요청합시다.

gcc의 경우 -E(대소문자 구분) 옵션을 사용하여 소스 코드의 번역 단위를 덤프합니다.

C 코드

// Header File
#include <stdio.h>

#define Max 10

int main()
{
    printf("Hello World"); // Print Hello World
    printf("%d", Max);
    return 0;
}


덤프 번역 단위

$ gcc -E cprogram.c


# 1 "cprogram.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "cprogram.c"
.......
.......
.......
typedef __time64_t time_t;
# 435 "C:/msys64/mingw64/x86_64-w64-mingw32/include/corecrt.h" 3

typedef struct localeinfo_struct {
  pthreadlocinfo locinfo;
  pthreadmbcinfo mbcinfo;
} _locale_tstruct,*_locale_t;

typedef struct tagLC_ID {
  unsigned short wLanguage;
  unsigned short wCountry;
  unsigned short wCodePage;
} LC_ID,*LPLC_ID;

.......
.......
.......
# 1582 "C:/msys64/mingw64/x86_64-w64-mingw32/include/stdio.h" 2 3
# 3 "cprogram.c" 2


# 5 "cprogram.c"
int main()
{
    printf("Hello World");
    printf("%d", 10);
    return 0;
}


번역 단위 코드에서 얻을 수 있는 내용:

*모든 선언은 헤더 파일에서 번역 단위로 복사됩니다.
*댓글은 삭제됩니다
*매크로 값은 번역 단위의 해당 위치에 복사됩니다.
위의 번역 코드는 stdio.h 헤더 파일(총 1038줄의 번역 단위)을 포함하기 때문에 용량이 매우 크므로 전체가 아닙니다. 전체 출력을 보려면 개발 머신에서 이 명령을 실행하십시오.

이 예는 전처리기가 어떻게 작동하는지 보여줍니다. 전처리기는 파일에서 내용을 복사하거나 텍스트 대체에 의한 매크로 확장을 통해 포함과 같은 간단한 작업만 수행합니다.

전처리기는 C 구문과 규칙을 모르고 입력 코드에서 지시문을 찾는 파서를 사용합니다.

cpp라는 도구가 있는데 C Pre-Processor는 C 파일을 전처리하는 데 사용됩니다. 이 도구는 UNIX의 각 버전과 함께 제공되는 C 개발 번들의 일부입니다.

$ cpp cprogram.c


이 코드는 c 프로그램의 전처리된 코드를 제공합니다.

전처리된 파일의 확장자는 .i이며 이 파일을 C 컴파일러에 전달하면 전처리기 단계를 건너뜁니다. 이것은 확장자가 .i인 파일이 이미 사전 처리되어 컴파일 단계로 직접 전송되기 때문에 발생합니다.

C Program Compilation에 대해 자세히 알아보십시오.

좋은 웹페이지 즐겨찾기