관리 메뉴

기억을 위한 기록들

[Fundamental C++] 2. 빌드 본문

C & CPP/Fundamental C++

[Fundamental C++] 2. 빌드

에드윈H 2021. 4. 27. 17:08

빌드는 크게 3단계로 나뉜다.

 

1. 전처리

2. 링크

3. 컴파일

 

 

정적 라이브러리를 생성하는 경우는 링크 과정이 필요하지 않다. 최종 목적의 바이너리를 만들어내기 위해 거치는 과정(전처리, 컴파일, 링크 등) 모두를 '빌드'라고 한다.

 

컴파일

컴파일의 대상은 소스 파일 즉, cpp파일이다. 헤더 파일(. h)은 컴파일의 대상이 아니다.

헤더파일은 특정 cpp파일 안의 #include 구문에 의해 포함될이다. 특정 cpp 파일이 컴파일되면서 #include에 의해 포함된 헤더 파일의 내용이 같이 컴파일되는 것뿐이다. 즉 헤더 파일은 단독으로 컴파일되지 않는다.

 

소스파일이 컴파일되면 목적(object)파일이 생성된다. 소스 파일과 목적 파일은 일대일 대응관계라고 할 수 있다.

소스파일이 사람이 이해하는 파일이라면, 이 소스파일을 기계가 읽을 수 있도록 기계어로 변환된 것이 목적 파일이다.

 

링크

하나의 소스(cpp) 파일만으로 실행 파일을 만들 수 있다면, 링크는 필요하지 않을 것이다. 대신 소스파일이 어마어마하게 클 것이다.

 

여러 개의 소스파일들을 컴파일하여 생기는 목적 파일들을 서로 연결시켜주는 게 링크이다. 수많은 목적(obj) 파일들이 프로세스 메모리 가상공간에 적재되었을 때 서로가 맞물릴 수 있도록 각각의 주소를 변경해주는 것을 의미한다.

 

 

전처리

전처리는 컴파일 시점에 컴파일이 가능하도록 소스 파일에 원래 소스 구문을 복구하는 과정이라고 할 수 있다.

#include <stdio.h>

int main()
{
  printf("Hello\n"); //printf는 stdio.h안에 있고 #include가 전처리 지시문인셈이다.
  return 0;
}

전처리 지시문 종류

1. #include

(" ") 따옴표 형식일 경우 파일과 동일한 디렉터리를 검색한다.

(< >) 꺽쇠 괄호 형식일 경우 /I 컴파일러 옵션과 INCLUDE 환경 변수에 지정한 경로를 따라서 검색한다.

즉, 따옴표 형식이 꺾쇠괄호 형식보다 좀더 포괄적인 검색범위를 가지고 있다. 직접 제작한 헤더파일인경우는 따옴표로 기존 시스템에서 제공하는 헤더파일의 경우 꺾쇠 괄호 형식을 사용하기도 한다.

 

2. #define

형식은 다음과 같다.

#define identifier token-string

identifier가 나타나면 token-string으로 대체하도록 지시하는 역할이다. identifier이 주석이나 문자열에 사용될 경우에는 대체하지 않는다

 

함수 형식처럼 사용도 가능하다.

 

#define identifier(identifier, ..., identifier) token-string
#define ADD(x, y) x + y


void main()
{
   std::cout<<ADD(2,4)<< std::endl;
}

하지만 #define 사용은 자제하는 게 좋다. 

hyo-ue4study.tistory.com/266?category=964791

 

[CPP-effective] 1-1 #define쓰려거든 다른걸 떠올리자.

1. #define을 쓰려거든 const, enum, inline을 떠올리자. (전처리기보단 컴파일러를 가까이 하자.) #define PI 3.1415926535 - 해당 PI가 있으면 컴파일러에게 넘어가기전에 전처리기가 밀어버리고 숫자 상수로

hyo-ue4study.tistory.com

3. #undef

#define에 의해 정의된 매크로를 해제하는 역할.

 

4. 조건부 컴파일 지시문

#if/#ifdef/#ifndef/#else/#elif/#endif 등

 

 

5. #pragma once

보통 헤더 파일 맨 처음에 쓰이며 헤더 파일을 단 한 번만 포함시키라는 의미.

 

 

'C & CPP > Fundamental C++' 카테고리의 다른 글

[Fundamental C++] 5. 배열  (0) 2021.04.27
[Fundamental C++] 4. 포인터  (0) 2021.04.27
[Fundamental C++] 3. 메모리  (0) 2021.04.27
[Fundamental C++] 1. 선언과 정의  (0) 2021.04.27
쓰기에 앞서  (0) 2021.04.14