一 以下是C程序一般的編譯過程:
從圖中看到:
將編寫的一個c程序(源代碼 )轉換成可以在硬件上運行的程序(可執行代碼 ),需要進行編譯階段 和鏈接這兩個階段。
其中,
1. 編譯階段先通過“編譯器 “把一個 .c / .cpp 源代碼 編譯成 .s的彙編代碼 ;再經過“彙編器 ” 把這 個.s的彙編代碼彙編成 .o 的 目標代碼
2. “連接器 “ 通過連接其他 .o 代碼(如果需要的話) 庫文件 和 1 中的.o 目標代碼生成可執行文件
該文件流被這三種程序(紅色)的加工,分別表現出四種形式(藍色) ,這就是c程序的編譯和鏈接過程。如果再詳細的話,編譯器在將源文件編譯成彙編文件的過程又分爲:預處理階段(生成 .i代碼) 和 優化階段
二、C編程中的文件後綴名介紹
.c 未經過預處理的C源碼
.h C頭文件
.i 經過預處理的C源碼
.s 生成的彙編語言代碼
.o 編譯之後產生的目標文件
解釋:*.c一般使我們自己編輯的代碼,使我們勞動的結晶;*.h一般是我們手工生成的接口文件,如果願意,也可在*.c完成後用GCC的選項-aux-info幫我們生成;*.i是經過預處理後的源碼,是由GCC在選項-E編譯下自動生成的文件;*.o是編譯後產生的目標文件;*.s是GCC在選項-S編譯下生成的彙編語言代碼,對於性能要求很高的程序可以先生成彙編語言文件並對彙編做優化,然後用優化後的彙編生成目標文件並鏈接
三 演示 hello.c 的編譯 過程(Linux 下 Gcc)
本小節的演示都針對文件 hello.c 進行
1. /*
2. * hello.c
3. */
4.
5. #include <stdio.h>
6. int main()
7. {
8. printf(" Better goal, Better life! /n");
9. return 0;
10. }
1.生成預處理後的文件 hello.i
$ gcc -E hello.c -o hello.i
2 .生成彙編語言文件 hello.s
$ gcc -s hello.i -o hello.s
3.生成目標文件 hello.o
$ gcc -c hello.i
$ gcc -c hello.s
4. 生成可執行文件
$ gcc -o hello hello.o
5. 運行及結果
$ ./hello
Better goal, Better life!
當然也可以直接生成, $ gcc -c hello.c 就可以生成可執行文件。這是Gcc內部的事。但就算是跳躍也要經過一步步的翻譯, 原理是相似的,萬變不離其宗!