天天看點

Linux系統GCC常用指令和GCC編譯過程描述

前言:

GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本隻能處理 C語言。GCC 很快地擴充,變得可處理 C++。後來又

擴充能夠支援更多程式設計語言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各類處理器架構上的彙編語言等,是以改

名GNU編譯器套件(GNU Compiler Collection)。(百度百科,想了解自己查詢)

一.GCC程式的編譯過程大概分四個階段

  • 預處理(Pre-Processing)
  • 編譯(Compiling)
  • 彙編(Assembling)
  • 連結(Linking)

二.簡單HelloWorld程式的編譯過程

示例:HelloWorld.c

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

Ctrl+Alt+T  --->打開控制台--->輸入vim HelloWorld.c

Linux系統GCC常用指令和GCC編譯過程描述
Linux系統GCC常用指令和GCC編譯過程描述

1. 執行如下指令:$ gcc -o HelloWorld HelloWorld.c

Linux系統GCC常用指令和GCC編譯過程描述

運作如下 : $ ./HelloWorld

輸出: HelloWorld!

Linux系統GCC常用指令和GCC編譯過程描述

2. 分步編譯如下:

(1) $ gcc –E HelloWorld.c -o HelloWorld.i

可以輸出HelloWorld.i檔案中存放着HelloWorld.c經預處理之後的代碼。打開HelloWorld.i檔案,看一看,就明白了。後面那條指令,是直接在指令行視窗中輸出預處理後的代碼.

gcc的-E選項,可以讓編譯器在預處理後停止,并輸出預處理結果。在本例中,預處理結果就是将stdio.h 檔案中的内容插入到HelloWorld.c中了。

Linux系統GCC常用指令和GCC編譯過程描述

//預處理結束

//這時候你看一下HelloWorld.i ,可以看到插進去了很多東西。

Linux系統GCC常用指令和GCC編譯過程描述

(2) $ gcc –S HelloWorld.i     

gcc的-S選項,表示在程式編譯期間,在生成彙編代碼後,停止,-o輸出彙編代碼檔案。

Linux系統GCC常用指令和GCC編譯過程描述

檢視下HelloWorld.s //生成彙編代碼後結束

Linux系統GCC常用指令和GCC編譯過程描述

(3)生成彙編代碼檔案HelloWorld.s以後,需要gas彙編器負責将其編譯為目标檔案,如下:

$ gcc –c HelloWorld.c

或者:

$ gcc -c HelloWorld.c –o HelloWorld.o

$ gcc -c HelloWorld.i -o HelloWorld.o

//編譯結束

//生成 HelloWorld.o檔案

Linux系統GCC常用指令和GCC編譯過程描述

(4) $ gcc HelloWorld.o –o HelloWorld 生成連接配接,可執行檔案(HellWorld重新生成的可執行檔案)

gcc連接配接器是gas提供的,負責将程式的目标檔案與所需的所有附加的目标檔案連接配接起來,最終生成可執行檔案。

附加的目标檔案包括靜态連接配接庫和動态連接配接庫。

對于上一小節中生成的HelloWorld.o,将其與C标準輸入輸出庫進行連接配接,最終生成程式HelloWorld可執行檔案

輸入指令:gcc HelloWorld.o –o HelloWorld--->生成如下圖:

Linux系統GCC常用指令和GCC編譯過程描述

3. 多個程式檔案的編譯

一般情況一個程式都是有若幹個檔案源檔案組成,是以編譯的時候需要形成多個編譯單元,使用GCC編譯器可以将多個源檔案編譯成所需要的程式

比如:源檔案有main.c     a.c     b.c  最終生成一個可執行的檔案main

比如:一個工程有main.c a.c b.c生成test的可執行檔案。

編譯指令如下:

$ gcc –c main.c a.c b.c –o main

$ gcc –o main main.c a.c b.c

GCC仍然會按照預處理、編譯和連結的過程依次進行

大概過程相當于:

gcc -c main.c -o main.o

gcc -c a.c -o a.o

gcc -c b.c -o b.o

最後:

gcc main.o a.o b.o -o main

繼續閱讀