下面來簡述一下C++.cpp檔案轉換為.exe檔案的過程。
我們知道當我們用C++編譯器編輯一個檔案時,這個檔案就是一個擴充套件名為.c或.cpp檔案,而當我們進行編譯執行之後,編譯器會為我們自動生成一個擴充套件名為.exe檔案。那麼這個過程是怎樣的呢?接下來我們來解析這樣一個過程。
首先我們來看圖解。
過程解析如下:
(一)預處理階段。首先我們會對我們編輯得到的原始碼(即擴充套件名為.c/.cpp檔案)通過前處理器進行預處理,這一部分是由我們的編譯器幫我們完成的。前處理器做的事情就是將原始原始檔中的所有前處理器指令替換為暗示指令的實際庫程式碼。那麼什麼是預處理指令呢?實際上這些是我們在程式碼很常見的,如#include和#define指令。之後,生成的檔案基本上被取代並獲得擴充套件名為.i檔案。
(二)編譯器編譯階段。接下來是編譯器的處理階段,這個階段是把高階語言翻譯成低階語言的過程,也負責檢查原始碼的語法/語法。若發現無誤,則會將檔案轉換為擴充套件名為.s的檔案,即我們所知的組合程式碼。
(三)目標檔案轉換階段。得到組合檔案之後,要對其進行轉換,即該過程是將組合級語言轉換為機器級語言(一般為二進位制格式),此時生成的檔案就是我們的目標檔案,擴充套件名為.o或.obj。
(四)連結階段。C++語言支援分離式編譯(這裡指的編譯是指上面(一)至(三)階段)機制的,該機制允許將程式分割為若干個檔案,每個檔案可獨立編譯。那麼多個已編譯的檔案如何合併呢?答案就是在此階段。該階段通過連結器將一個或多個目標檔案合併到一個可執行檔案,即將擴充套件名為.obj / .o檔案轉換為擴充套件名為.exe檔案。
以上的四個階段就是.cpp檔案轉換為.exe檔案的過程。
注:我們平常所說的「編譯」是一個整體,即包括預處理,編譯和組合三個階段。它在這些步驟中基本上將高階語言轉換為機器級語言,並生成單個二進位制物件檔案。若編譯(但不連結)三個單獨的檔案,則將建立三個作為輸出的目標檔案。