-
[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
'개발 > C·C++' 카테고리의 다른 글
[const member function] 이면에 있는 조금 더 복잡한 것 (0) 2021.04.22 객체 지향 개론 (0) 2021.04.21 [Name mangling/Name decoration] 유일한 이름을 위해 (0) 2021.04.19 디폴트 파라미터와 함수의 프로토타입 (0) 2021.04.17 참조(reference) 변수 (0) 2021.04.17