Ubuntu之如何使用gcc編譯C語言程序

在大學(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è)更深刻的了解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容