1鳞陨、前言
如果你使用的是集成開(kāi)發(fā)環(huán)境,那么你點(diǎn)擊編譯按鈕就可生成可執(zhí)行文件洛巢,然后點(diǎn)擊運(yùn)行即可運(yùn)行括袒。那么,你知道從源代碼到可執(zhí)行文件經(jīng)歷了哪些過(guò)程嗎稿茉。僅僅是編譯锹锰?
下面以windows
環(huán)境下的test.c
為例,test.c
里的代碼為:
#include <stdio.h>
int main(void)
{
printf("This is a test program!\n");
return 0;
}
其經(jīng)歷如下過(guò)程:
如圖漓库,編譯生成可執(zhí)行文件的過(guò)程實(shí)際包含四個(gè)過(guò)程:(1)預(yù)處理恃慧;(2)編譯;(3)匯編渺蒿;(4)鏈接痢士。
2、預(yù)處理(Preprpcessing)
使用預(yù)處理器把源文件test.c
經(jīng)過(guò)預(yù)處理生成test.i
文件茂装,預(yù)處理用于將所有的#include頭文件以及宏定義替換成其真正的內(nèi)容怠蹂。
預(yù)處理的命令為:
gcc -E test.c -o test.i
上述命令中-E
是讓編譯器在預(yù)處理之后就退出,不進(jìn)行后續(xù)編譯過(guò)程少态;-o
是指定輸出文件名城侧。
預(yù)處理之后得到的仍然是文本文件。test.i文件部分內(nèi)容截圖如下:
3彼妻、編譯(Compilation)
使用編譯器將預(yù)處理文件test.i
編譯成匯編文件test.s
嫌佑。
編譯的命令為:
gcc -S test.i -o test.s
上述命令中-S讓編譯器在編譯之后停止,不進(jìn)行后續(xù)過(guò)程澳骤;-o是指定輸出文件名歧强。匯編文件test.s是文本文件澜薄,部分內(nèi)容截圖如下:
4为肮、匯編(Assemble)
使用匯編器將匯編文件test.s
轉(zhuǎn)換成目標(biāo)文件test.o
。
匯編過(guò)程的命令為:
gcc -c test.s -o test.o
上述命令中-c
肤京、-o
讓匯編器把匯編文件test.s
轉(zhuǎn)換成目標(biāo)文件test.o
颊艳。目標(biāo)文件test.o
是二進(jìn)制文件茅特,部分內(nèi)容截圖如下:
5、鏈接(Linking)
鏈接過(guò)程使用鏈接器將該目標(biāo)文件與其他目標(biāo)文件棋枕、庫(kù)文件白修、啟動(dòng)文件等鏈接起來(lái)生成可執(zhí)行文件。
鏈接過(guò)程的命令為:
gcc test.o -o test.exe
綜上重斑,生成可執(zhí)行程序過(guò)程為:預(yù)處理兵睛、編譯、匯編窥浪、鏈接祖很。各個(gè)命令如下圖所示:
關(guān)注我的公號(hào)【嵌入式大雜燴】,回復(fù):C語(yǔ)言漾脂,可獲取C語(yǔ)言資料假颇。
關(guān)注我的個(gè)人博客:【正念的博客】查看更多筆記