ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Build process] Three steps
    개발/C·C++ 2021. 4. 19. 17:13

    빌드 과정은 크게 세 가지로 나눌 수 있습니다.

     

    전처리

    전처리기가 #include, #define 등의 전처리기 지시자를 통해 C++ 소스 코드를 가져옵니다. 이 과정의 결과물은 순수 C++ 파일입니다. #include 지시자는 각각의 파일로(주로 선언문) 대체되고, 매크로(#define)로 변경이 일어납니다. #if, #ifdef, #ifndef 지시자는 상황에 따라 다른 부분을 선택하게 됩니다. 비주얼 스튜디오의 cl 컴파일러 기준으로 전처리가 끝나면 i라는 확장자를 가진 파일이 생성됩니다. cmd에서는 cl [file.cpp] /P 명령어를 통해 만들 수 있습니다.(여기서 말하는 cmd는 비주얼 스튜디오가 제공하는 Developer Command Prompt입니다)

     

    #define DOUBLE(X) X+X
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    int mul(int, int);
    
    int main(int argc, char* argv[])
    {
    	int total = 1;
    	for (int i = 1; i < argc; ++i)
    	{
    		int num = stoi(argv[i]);
    		total = mul(total, num);
    	}
    	DOUBLE(10);
    	cout << total << endl;
    }
    // ..전략
    
    [[nodiscard]] inline wstring to_wstring(float _Val) { 
        return ::std:: to_wstring(static_cast<double>(_Val));
    }
    
    [[nodiscard]] inline wstring to_wstring(long double _Val) { 
        return ::std:: to_wstring(static_cast<double>(_Val));
    }
    }
    
    #pragma warning(pop)
    #pragma pack(pop)
    #line 598 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29910\\include\\string"
    #line 599 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29910\\include\\string"
    #line 5 "build.cpp"
    using namespace std;
    
    int mul(int, int);
    
    int main(int argc, char* argv[])
    {
    	int total = 1;
    	for (int i = 1; i < argc; ++i)
    	{
    		int num = stoi(argv[i]);
    		total = mul(total, num);
    	}
    	10+10;
    	cout << total << endl;
    }

    위 코드에서 to_wstring 함수가 <string> 헤더의 끝부분입니다. 매크로도 바뀐 걸 확인할 수 있습니다.(전처리 파일을 가지고 목적 파일을 만드는 방법은 찾지 못했습니다)

     

    컴파일

    전처리 과정이 끝나면 순수 C++ 파일이 만들어집니다. 어셈블러는 대부분의 경우 컴파일러에 병합되어 있습니다. 어셈블러가 순수 C++ 파일을 어셈블리 코드로 변환합니다. 그러고 나서 포맷에 맞춰 바이너리 파일을 만들면 오브젝트(목적) 파일이 탄생합니다. cmd에서 cl [file.cpp] /c 명령어를 통해 목적 파일을 만들 수 있습니다. obj 확장자의 파일이 생깁니다.

     

    링킹

    링커는 컴파일러가 만든 목적 파일을 한데 모읍니다. 이 결과물은 라이브러리 파일이 될 수도 있고 실행 파일이 될 수도 있습니다. 링커가 오브젝트 파일을 연결할 때 미정의된 심볼의 레퍼런스를 정확한 주소로 대체합니다. 각자의 심볼은 다른 오브젝트 파일이나 라이브러리에서 정의됩니다. 이 과정에서 흔하게 발생하는 에러는 정의를 찾지 못하거나 정의가 중복되는 경우입니다. cmd에서 link [file1.ob] [file2.obj] 식으로 필요한 오브젝트 파일들을 연결할 수 있습니다. 

     

    출처>

    stackoverflow.com/questions/6264249/how-does-the-compilation-linking-process-work

    댓글

Designed by Tistory.