C語言編譯過程

  編輯hello.c,以此文件爲例 優化

1 #include <stdio.h>
2 #include <stdlib.h>
3 int main()
4 {
5         printf("hello world!\n");
6         return 0;
7 }

【 第一步】 預處理   hello.c---hello.ispa

    預處理過程實質上是處理''#'',將#include包含的頭文件直接拷貝到hello.c當中;將#define定義的宏進行替換,同時將代碼中沒用的註釋部分刪除等 翻譯

    具體作的事兒以下:調試

    (1) 將全部的#define刪除,並展開全部的宏定義。code

    (2)處理全部的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些blog

    (3)處理#include,將#include指向的文件插入到該行處編譯器

    (4)刪除全部註釋io

    (5)添加行號和文件標示 ,這樣在調試和編譯出錯的時候才知道是哪一個文件的哪一行 編譯

    (6)保留#pragma編譯器指令,由於編譯器須要使用它們class

 

    【第二步】編譯  hello.i---hello.s

    編譯的過程實質上是把高級語言翻譯成機器語言的過程

    (1)詞法分析

    (2)語法分析

    (3)語義分析

    (4)優化後生成相應的彙編代碼

    從高級語言->彙編語言->機器語言(二進制)

 

    【第三步】彙編 hello.s---hello.o

    彙編器as將hello.s翻譯成機器語言保存在hello.o中(二進制文本形式)

 

    【第四步】連接 hello.o--- hello

    就像剛纔的hello.c,它使用到了C標準庫的東西「printf」,可是編譯過程只是把源文件翻譯成二進制而已,這個二進制還不能直接執行,這個時候就須要作一個動做,

    將翻譯成的二進制與須要用到的庫綁定在一塊。

 

    也能夠直接使用如下命令完成編譯

         gcc hello.c -o hello 能夠生成可執行程序。即gcc不帶任何參數。ldd能夠看到你的可執行程序依賴的庫

相關文章
相關標籤/搜索