C++의 작동방식

C++의 작동방식

C++와 같은 언어에서 코드를 작성한 뒤, 이를 실행하기 위해서는 코드를 빌드 해야한다.

전처리기, 컴파일러와 링커가 해당 작업을 수행하는데, 해당 과정에 대해 간략하게 알아보자.

1. 전처리기 연산자.

코드가 컴파일러에 들어오면, 가장 먼저 전처리기 명령문을 처리하게 된다. 이 과정을 “전처리”라고 하며, 컴파일 직전에 발생한다. (매크로라고도 한다.)

전처리기 명령문은 다양한 명령이 존재하며, 대표적으로 #include, #define, #if, #ifdef 등이 있다.

꼭 알아야 하는 전처리기 명령문을 꼽자면, #include #if ~ #ifend , #pragma once , #define 등이 있다.

2. 컴파일 과정

프로젝트 내의 C++ 소스 코드를 독립적인 기계어 코드로 변환하는 과정이다.

모든 .cpp확장자 코드는 모두 독립적인 기계어 파일로 컴파일 되며, Visual Studio에서는 .obj 를 확장자로 사용한다.

컴파일러는 플랫폼(예: x86, x64), **운영 체제(예: 윈도우, 리눅스, 안드로이드)**에 따라 서로 다른 기계어 코드를 생성한다. 따라서, 이러한 운영체제가 전환된 환경에서는 실행 및 최적화가 보장되지 않는다. (물론 크로스 플랫폼이 불가능하다는 뜻은 아니다.)

따라서, 환경을 정확히 설정해야 올바른 컴파일 과정을 수행할 수 있다.

추가 정보

  • 프로젝트에서 하나의 파일만 컴파일하고 싶다면, ctrl + F7 으로 해당 작업을 수행할 수 있다.

기계어 코드가 독립적이라면, 어떻게 다른 파일의 함수를 가져올까?

컴파일만 한 상태에서는 다른 파일의 함수를 가져오는 것이 불가능하다.

컴파일 당시에는 컴파일러는 함수의 선언만 확인하고, 실제 함수가 작동하는지, 구현되어 있는 지 등은 전혀 신경쓰지 않는다.(따라서, 컴파일 에러와 링커 에러가 구분되어 있다.)

실제 코드가 어디에 있고 어디에 연결하는 지는 “링커”가 수행하는 역할이다.

3. 링킹 과정

파일에 대한 컴파일이 끝나고, 전체 프로젝트를 빌드하게 되면, 링커는 선언된 함수들의 정의를 찾게 된다. (정의와 선언의 차이는 아래의 링크를 참고하자. – 수정중 -)

컴파일을 하고 나면, main.cpp(꼭 main.cpp 는 아니나 통상적인)에서 사용되는 함수의 정의를 찾게 된다. 만약 함수의 정의를 찾지 못하면 링커 오류가 발생한다.

링커의 임무는 함수의 선언과 정의를 연결하고, 실제 구현 위치가 어디인지도 알아내는 것이다.

4. 참고 영상

How C++ Works

https://ko.wikipedia.org/wiki/C_%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0

soypablo

안녕하세요! SOYPABLO입니다!

답글 남기기