C語言編譯過程

寫在前面

????對于C語言,我們大家可能不陌生。工作中經(jīng)常會使用到,我們在工作中寫代碼,其中的編譯和執(zhí)行過程都是交給IDE來運行的,其中C語言從源文件(.c)文件到最后的執(zhí)行結(jié)果,其中到底經(jīng)過了那幾步,卻鮮為人知。
????最近正好在復習C語言,希望可以拋磚引玉,不足之處,請大家留言,大神請飄過。

首先,第一部分向大家簡單展示一下C語言的編譯過程,第二部分,我們再通過具體的代碼示例向大家展示。

第一部分

C語言編譯過程簡述

??C語言的編譯過程有以下幾個步驟,分別是:

  1. 預處理:??gcc -E Hello.c -o Hello.i
  2. 匯編:??gcc -S Hello.i -o Hello.s
  3. 編譯為二進制:??gcc -c Hello.s -o Hello.o ????// -c 中的c是小寫
  4. 鏈接:??gcc Hello.o -o Hello

?.c 結(jié)尾的是C語言文件
?.i 結(jié)尾的是處理后的C語言文件
?.s 結(jié)尾的是編譯后的匯編文件
?.o 是編譯后的目標文件

第二部分

具體示例
第一步,編輯Hello.c源文件
#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("Hello World!\n");
    return 0;
}
第二步,執(zhí)行預處理

預處理過程實質(zhì)上是處理“#”,將#include包含的頭文件直接拷貝到Hello.c當中;將#define定義的宏進行替換,同時將代碼中沒用的注釋部分刪除等...
具體做的事兒如下:
(1)將所有的#define刪除,并且展開所有的宏定義,其實就是字符替換;
(2)處理所有的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些;
(3)處理#include,將#include指向的文件插入到該行處;
(4)刪除所有注釋;
(5)添加行號和文件標示,在調(diào)試和編譯出錯的時候才知道錯誤位置;
(6)保留#pragma編譯器指令,因為編譯器需要使用它們。

執(zhí)行:gcc -E Hello -o Hello.i


執(zhí)行預處理.png

預處理的結(jié)果


預處理后對比.png
第三步,執(zhí)行匯編

編譯的過程實質(zhì)上是把高級語言翻譯成機器語言的過程,即對Hello.c做了這些事兒
(1)詞法分析;
(2)語法分析;
(3)語義分析;
(4)優(yōu)化后生成相應的匯編代碼。

執(zhí)行:gcc -S Hello.i -o Hello.s

執(zhí)行編譯.png

編譯后的結(jié)果


編譯后對比.png
第四步,翻譯為二進制代碼

執(zhí)行:gcc -c Hello.s -o Hello.o


再次編譯.png

編譯后結(jié)果

生成.o文件.png
第五步,鏈接處理

可以生成可執(zhí)行程序,就像剛才的hello.c它使用到了C標準庫的東西“printf”,但是編譯過程只是把源文件翻譯成二進制而已,這個二進制還不能直接執(zhí)行,這個時候就需要做一個動作,將翻譯成的二進制與需要用到庫綁定在一塊。
執(zhí)行:gcc Hello.o -o Hello

鏈接.o文件.png

鏈接后結(jié)果

生成可執(zhí)行文件.png
第六步,執(zhí)行可執(zhí)行文件
執(zhí)行.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內(nèi)容

  • 示例代碼 a.c head.h head.c 預處理 處理關(guān)于 “#” 的指令 刪除#define,展開所有宏定義...
    第八區(qū)閱讀 482評論 0 0
  • 概述 我們寫出的C語言代碼(.c文件),若要在機器上運行,需要經(jīng)過一個編譯過程,主要分為如下四個階段(參考1,表1...
    NapoleonY閱讀 4,929評論 0 5
  • 我們一般使用命令: gcc main.c 把main.c生成可執(zhí)行文件a.out gcc helloWorld.c...
    小花來了閱讀 716評論 0 0
  • 1,編譯預處理(gcc -E main.c -o main.i) 文件包含復制 將源文件中一"#include"格...
    ytlm閱讀 274評論 0 1
  • 預處理(Pre-Processing) hello.c -> hello.i gcc -E hello.c -o ...
    aapu閱讀 375評論 0 3