gcc hello.c 的背後是什麼

在c語言中編寫“hello world!” 程序基本成了每個學習過c語言的人必寫的程序之一,點擊運行,(如果沒錯的話)就會在黑框裏面顯示 hello world!


在LInux 下使用 gcc 來編寫 "hello world!" 程序時,也是隻用到最簡單的命令(假設 hello world! 程序的原文件名爲 hello.c ):

 [……]$gcc hello.c

 [……]$./a.out

其實,在 gcc 的背後,編譯器爲你做了四個步驟: 分別是 預編譯、編譯、彙編、鏈接。

【1】預編譯:

    預編譯是預編譯器cpp把源代碼文件和相關的頭文件 (如 stdio.h ) 預編譯成一個 .i 文件,

    預編譯的過程相當於如下命令:

    $gcc -E hello.c -o hello.i    或者   $gcc hello.c > hello.i

    預編譯的處理規則:

     (1) 將所有的 "#define" 刪除,並展開所有的宏定義;

     (2)處理所有的條件預編譯指令,比如:" #if    #ifdef   #elif   #else    #endif ";

     (3)處理所有的 "#include" 預編譯指令

     (4)刪除所有的註釋 "//" 、 "/* */";

     (5)添加行號和文件名標識,以便編譯時產生的行號信息以及用於編譯錯誤或警告時能夠顯示行號;

     (6)保留所有的 "#pragma" 編譯器指令

【2】編譯:

    編譯過程是編譯器gcc把預處理完的文件進行詞法分析、語法分析、語義分析及優化後生成相應的彙編代碼文件。編譯過程是最複雜的過程之一。

    編譯過程可以使用如下命令:

    $gcc -S hello.i -o hello.s    或者  $gcc -S hello.c -o hello.s 

    都可以得到彙編輸出文件 hello.s

【3】彙編:

    彙編是彙編器as把彙編代碼轉變成中間目標文件。

    彙編過程可以使用如下命令:

    $gcc -c hello.s -o hello.o   或者   $gcc -c hello.c -o hello.o

    可以得到中間目標文件 hello.o

【4】鏈接:

    鏈接是鏈接器ld把中間目標文件和相應的庫一起鏈接成爲可執行文件。

    如果前面使用的是$gcc hello.c 命令,默認會產生一個 a.out 的可執行文件, 使用命令 $./a.out執行該可執行文件

    如果前面使用的是$gcc -o test hello.c 命令,會產生一個test 的可執行文件,使用命令$./test執行該文件

  上述兩種方法效果是一樣的。

     gcc編譯過程圖解:

           

 














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章