編輯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能夠看到你的可執行程序依賴的庫