編寫好的 C 程序源碼 (*.c) 是個某種編碼格式下的文本文件,需要被 “翻譯” 成機器語言表示的可執行程序,這個過程被稱為 編譯 。(此處的 編譯 是下文四個步驟的統稱,與步驟二有所區分。)
C 程序的編譯過程可以分為以下四個步驟:
- 預處理 (Preprocessing)
- 編譯 (Compilation)
- 匯編 (Assemble)
- 鏈接 (Linking)
預處理 (Preprocessing)
預處理過程讀取 C 程序源碼 (*.c) 的文本內容,按照預處理指令 (例如頭文件包含、宏定義等) 替換 相應的文本內容。
預處理過程的輸出文件仍然是文本文件 (*.i) ,但是文件體積比輸入文件大。
編譯 (Compilation)
編譯過程將預處理后的程序文本 (*.i) 轉換成匯編代碼 (Assembly Code / *.s) 。
匯編 (Assemble)
匯編過程將匯編代碼 (*.s) 轉換成與指定硬件相匹配的機器碼 (Machine Code) 。
匯編過程的輸出文件被稱為目標文件 (*.o) ,這是一種是二進制文件。
對於每一個源碼文件 (*.c) ,匯編后將產生相應的目標文件。
鏈接 (Linking)
鏈接過程將項目中的多個目標文以及所需的庫文件鏈接成最終的可執行文件 (Executable File) 。
現在有些編譯器 (例如GCC) ,把預處理、編譯和匯編三個步驟一次性完成,稱為 編譯 操作,並把 鏈接 作為第二個步驟生成二進制的可執行程序。
也有一些編譯器會將四個步驟一次性完成,直接生成二進制的可執行程序。
