當你編寫一個 C++ 程式時,下一步是在執行它之前編譯它。編譯是將人類可讀語言(如 C、C++ 等)編寫的程式轉換為中央處理單元直接理解的機器碼的過程。從原始檔建立可執行檔案涉及許多階段。這些階段包括 C++ 中的預處理、編譯和連結。這意味著即使程式已編譯,也可能因為在連結階段出現錯誤而無法執行。因此,大多數 IDE(整合開發環境),如 Eclipse、Geany 等,都將“構建”一詞用於將原始檔轉換為可執行檔案的過程。
現在,如何編譯某個程式取決於作業系統和編譯器。如今,編譯器都是透過 IDE(整合開發環境)執行的,其中包含構建和分析工具。你只需單擊選單即可編譯程式,然後執行它。但實際上,整個過程分為不同的階段。這正是 C++ 中編譯和連結的作用所在。
預處理
在此階段,預處理器根據指令(以 # 符號開頭)更改程式。C++ 預處理器處理程式並處理 #include 指令,生成的程式是純 C++ 程式。例如,在 C++ 程式中,#include<iostream> 會指示預處理器讀取 iostream 標頭檔案的所有內容,並將這些內容包含到程式中,從而生成一個單獨的 C++ 程式檔案。C++ 支援許多預處理器指令,如 #include、#define、#if、#else 等。
編譯
此階段將程式轉換為低階組合語言程式碼。編譯器接收預處理過的檔案(不帶任何指令),並生成包含組合語言程式碼的目標檔案。現在,建立的目標檔案是二進位制形式的。在建立的目標檔案中,每一行都描述了一個低階機器指令。轉換為組合語言很重要,因為它是許多不同高階語言編譯器的通用輸出語言。
還有一個彙編階段,它將這些組合語言的目標檔案轉換為機器指令,建立的檔案是可重定位的目的碼。因此,編譯階段生成可重定位的目標程式,該程式可以在不同位置使用,無需重新編譯。
但是,在將這些目標檔案轉換為可執行檔案之前,你仍然無法執行它們,現在連結器發揮作用了,它將所有目標檔案連結起來生成一個單獨的可執行檔案。
連結
連結顧名思義,是指從多個目標檔案建立單個可執行檔案的過程。連結後建立的檔案已準備好載入到記憶體中並由系統執行。在理解錯誤方面,連結與編譯有所不同。編譯器顯示語法錯誤,例如缺少分號、未定義資料型別等,但如果某個函式被定義了多次,那麼這個錯誤就來自連結器,因為它表明兩個或多個原始檔具有相同的含義,這會導致錯誤。
附件:[Selection_101.png] [Selection_103.png]