使用gcc編譯程序時,編譯工程分為4個階段:
(1)預處理:(Pre-Processing)
(2)編譯:(Compiling)
(3)匯編:(Assembling)
(4)鏈接:(linking)
Linux程序員可以根據自己的需要讓gcc在編譯的任何階段結束,以便檢查或使用編譯器在該階段輸出信息,或者對最后生成的二進制文件進行控制,以便加入不同數量和種類的調試代碼來為今后的調試做好准備。和其他常用的編譯器一樣,gcc提供了靈活而強大的代碼優化功能,利用它可以生成執行效率較高的代碼。
在功能上,預處理、編譯、匯編是3個不同的階段,但gcc在實際操作時可以把3個步驟合並為一個步驟來執行。下面以一個實例介紹如何生成各個階段的代碼。
本小節的演示都針對文件 hello.c 進行
1. /*
2. * hello.c
3. /
4.
5. #include <stdio.h>
6. int main()
7. {
8. printf(" Bettergoal, Better life! /n");
9. return 0;
10. }
第一階段
在預處理階段,輸入的是C語言源文件,通常為.c或者.C,它們一般帶有h之類的頭文件。這個階段主要處理源文件中的#ifdef、#include和#define預處理命令。該階段會生成一個中間文件.i
1.生成預處理后的文件hello.i
$ gcc -E hello.c -o hello.i
它通過對源文件hello.c使用E選項來生成中間文件hello.i
第二階段
在編譯階段,輸入的是中間文件.i,編譯后生成匯編語言文件.s。這個階段對應的gcc命令如下所示:
2 .生成匯編語言文件hello.s
$ gcc-s hello.i -o hello.s
第三階段
在匯編階段,將輸入的匯編文件.s轉換成二進制機器代碼.o,這個階段對應的gcc命令如下所示:
$ gcc -c hello.s-o hello.o
第四階段
在鏈接階段,將輸入的二進制機器代碼文件.o(與其他機器代碼文件和庫文件)匯集成一個可執行的二進制代碼文件。
4. 生成可執行文件
$ gcc hello.o -o hello
總結版:
對應以上四個階段,直接一個命令
gcc hello.c -o hello
最后階段
5. 運行及結果
$ ./hello
Better goal, Better life!
一以下是C程序一般的編譯過程:
從圖中看到:
將編寫的一個c程序(源代碼 )轉換成可以在硬件上運行的程序(可執行代碼 ),需要進行編譯階段 和鏈接這兩個階段。
其中,
1. 編譯階段先通過“編譯器 “把一個 .c/ .cpp 源代碼 編譯成 .s的匯編代碼 ;再經過“匯編器 ”把這個.s的匯編代碼匯編成 .o 的目標代碼
2. “連接器 “ 通過連接其他 .o 代碼(如果需要的話)庫文件和1中的.o 目標代碼生成可執行文件
該文件流被這三種程序(紅色)的加工,分別表現出四種形式(藍色),這就是c程序的編譯和鏈接過程。如果再詳細的話,編譯器在將源文件編譯成匯編文件的過程又分為:預處理階段(生成 .i代碼)和 優化階段
