1. 預(yù)編譯:
預(yù)編譯過(guò)程主要處理那些源代碼文件中的以“#
”開始的預(yù)編譯指令势就。
比如“#include
”“#define
”等。
主要處理規(guī)則如下:
(1)展開所有的宏
(2)處理所有的條件編譯指令
(3)處理預(yù)編譯指令祝辣,將被包含的文件遞歸插入到該預(yù)編譯指令的位置
(4)刪除所有的注釋
(5)添加行號(hào)和文件名標(biāo)識(shí)畜号,以便編譯器產(chǎn)生錯(cuò)誤信息
(6)保留所有的“#pragma
”編譯器指令
$ gcc -E hello.c -o hello.i
<u></u>-E
表示只進(jìn)行預(yù)編譯
2. 編譯:
編譯就是把預(yù)處理完的文件尿这,進(jìn)行一系列詞法分析簇抵,語(yǔ)法分析,語(yǔ)義分析及優(yōu)化后生成相應(yīng)的匯編代碼文件射众。
$ gcc -S hello.i -o hello.s
3. 匯編:
匯編器是將匯編代碼轉(zhuǎn)變成機(jī)器可以執(zhí)行的指令碟摆,每一個(gè)匯編語(yǔ)句幾乎都對(duì)應(yīng)一條機(jī)器指令。
$ gcc -c hello.s -o hello.o
4. 鏈接:
一個(gè)復(fù)雜的軟件叨橱,每個(gè)源代碼模塊獨(dú)立編譯典蜕,然后按需將它們組裝起來(lái),這個(gè)組裝模塊的過(guò)程就是鏈接罗洗。
鏈接過(guò)程主要包括:
(1)地址和空間分配(Address and Storage Allocation)
(2)符號(hào)決議(Symbol Resolution)
(3)重定位(Relocation)
每個(gè)模塊的源代碼文件(.c
文件)經(jīng)過(guò)編譯器編譯成目標(biāo)文件(.o
文件)愉舔,目標(biāo)文件和庫(kù)一起鏈接形成最終可執(zhí)行文件。