프로그래밍을 처음 접할 때 만나는 첫 예제는 Hello World 출력이다.
해당 예제의 빌드 과정을 살펴보자.
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
일단 gcc로 빌드를 해보자. 먼저 앞의 예제 코드를 포함한 hello.c 파일을 만든다.
그 후, gcc hello.c -o hello
를 통해 실행파일 hello를 생성한다.
./hello
를 통해 해당 파일을 실행하자.
단 한 줄의 명령어로 실행파일이 만들어졌다. 하지만 실제로는 다양한 과정이 필요하다.
자료 출처 : C언어 빌드 과정 with gcc - 서준수
빌드 과정은 여러 중간 단계를 거친다. gcc 옵션을 통해 각 단게별로 결과를 확인할 수 있다.
컴파일러인 gcc는 다음과 같이 각 단계에 적합한 툴을 호출한다.
헤더 파일을 포함하고 매크로 확장을 하는 단계이다. 매크로 확장은 매크로 생성이라고도 한다. 즉 당므과 같은 구문을 처리하는 것이다.
전처리기는 cpp를 활용한다.
#include <stdio.h> // 헤더 파일 추가
#define MAX_NUM = 100 // 매크로
gcc 명령으로는 gcc -E hello.c -o hello.i
로 확인할 수 있다. 이를 통해 hello.i라는 파일을 생성한다.
전처리된 파일을 컴파일하는 과정이다. 컴파일이란 작성한 프로그램 코드를 컴퓨터가 이해할 수 있는 언어로 변환하는 작업이다.
gcc는 cc1라는 툴에 의해 어셈블리 코드 파일(.s) 파일이 생성된다.
이를 위해 gcc -S hello.i
라는 명령어를 사용한다.
어셈블 단계에서는 컴파일하여 만들어진 어셈블리 코드를 기계어 형태로 번역해준다.
이를 통해 2진수 기계어로 되어있는 오브젝트 파일(.o)을 생성한다.
명령어는 gcc -c hello.s
이다.
생성된 오브젝트 코드와 실행에 필요한 (static) 라이브러리가 있으면 연결된다.
명령어는 gcc hello.o -o hello
이다.
이를 통해 실행파일이 생성된다.