本文主要講述了一個(gè)C程序從源代碼到目標(biāo)文件所經(jīng)過(guò)的步驟,介紹了編譯系統(tǒng),預(yù)處理、編譯、匯編和鏈接的相關(guān)知識(shí)。
一、編譯系統(tǒng)
一個(gè)C程序的生命周期從高級(jí)C語(yǔ)言程序開(kāi)始。想要在系統(tǒng)上執(zhí)行.c程序,每條C語(yǔ)句都必須翻譯為低級(jí)的機(jī)器語(yǔ)言指令,將這些指令按照可執(zhí)行目標(biāo)程序的格式打包,以二進(jìn)制磁盤文件的形式存放,這就是可以由系統(tǒng)執(zhí)行的可執(zhí)行目標(biāo)文件。這些工作包含如下圖所示的四個(gè)過(guò)程,由編譯系統(tǒng)完成。
一般而言,編譯系統(tǒng)包括預(yù)處理器、編譯器、匯編器和鏈接器。
注意一下上圖中各個(gè)階段輸出的文件格式是文本文件還是二進(jìn)制文件。
1.預(yù)處理階段
源代碼.c文件和相關(guān)的頭文件如stdio.h等被預(yù)處理器編譯為一個(gè).i文件。
預(yù)處理過(guò)程主要處理那些源代碼文件中的以#開(kāi)頭的預(yù)處理指令。主要規(guī)則如下:
a.刪除所有的#