在大學(xué)里面大家都用過VC6.0來進(jìn)行編程。VC6.0屬于集成開發(fā)環(huán)境,一份代碼從文本變成可執(zhí)行的程序只需要在其中點(diǎn)擊幾個(gè)按鈕就行了,加之老師也只教過我們?nèi)绾尾僮?,并未介紹C語言的執(zhí)行過程。上一篇曾提到過,Linux下的開發(fā)環(huán)境沒有集成,需要一個(gè)一個(gè)操作。這固然不如VC6.0方便,但學(xué)會(huì)如何使用gcc編譯器工具后,可以使我們加深對(duì)C語言執(zhí)行過程的理解,這是非常重要的。
gcc編譯C程序的主要過程包括:預(yù)編譯(Preprocessing)——編譯(Compilation)——匯編(Assembly)——連接(Linking/Build) 四個(gè)過程,每個(gè)過程都分別進(jìn)行不同的處理,下面假設(shè)已經(jīng)寫好了一個(gè)文件:hello.c,并以此為例仔細(xì)介紹。
一、預(yù)編譯
該過程會(huì)對(duì)各種預(yù)處理指令(以#開頭的代碼行,如#include,#define,#ifdef等等)進(jìn)行處理,刪除注釋和多余的空白字符。
命令:gcc -E hello.c -o hello.i
對(duì)命令的解釋:E是參數(shù),是通知gcc對(duì)hello.c進(jìn)行預(yù)編譯; ? ? ?o是參數(shù),是對(duì)命令輸出結(jié)果進(jìn)行導(dǎo)入操作,這里是將gcc -E hello.c操作結(jié)果輸出到文件hello.i(這里文件名可以自定義)進(jìn)行保存。
注:Linux對(duì)大小寫敏感,此處必須為大寫E。
二、編譯
該過程會(huì)對(duì)代碼進(jìn)行語法、語義分析和錯(cuò)誤判斷,生成匯編代碼文件。
命令:gcc -S hello.i -o hello.s
對(duì)命令的解釋:S是參數(shù),用于通知gcc對(duì)目標(biāo)文件hello.i進(jìn)行編譯。
三、匯編
該過程會(huì)將匯編代碼轉(zhuǎn)化為計(jì)算機(jī)可識(shí)別的二進(jìn)制文件。
命令:gcc -c hello.s -o hello.o
對(duì)命令的解釋:c是參數(shù),用于通知gcc對(duì)木匾文件hello.s進(jìn)行指令轉(zhuǎn)換操作。
注:可以通過命令“readelf -a hello.o”將hello.o轉(zhuǎn)變?yōu)槲覀兛梢宰x懂的形式。
四、連接
該過程就是將多個(gè)******.o文件合并成一個(gè)可執(zhí)行文件(也就是二進(jìn)制指令),類似windows下的.exe文件。
命令:gcc hello.o -o hello
對(duì)命令的解釋:hello就是我們最后能夠直接運(yùn)行的可執(zhí)行文件。
注:可以通過命令“objdump -d hello”將該可執(zhí)行文件hello轉(zhuǎn)變?yōu)閰R編語言;也可以通過readelf來讀該文件內(nèi)容。
五、運(yùn)行程序
直接雙擊輸出的可執(zhí)行文件hello無效,需要通過命令行來使它運(yùn)行。
命令:./hello
六、小結(jié)
其實(shí),并不需要這么多步操作,只需要對(duì)最開始的文本文檔hello.c執(zhí)行命令“gcc hello.c -o hello”,即可生成計(jì)算機(jī)可執(zhí)行文件hello,然后執(zhí)行命令“./hello”即可運(yùn)行命令。之所以有這么多步,只是方便我們對(duì)C語言的編譯過程有個(gè)更深刻的了解。