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

 

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


運行如下 : $ ./HelloWorld
輸出: HelloWorld!


2. 分步編譯如下:
(1) $ gcc –E HelloWorld.c -o HelloWorld.i

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

gcc的-E選項,可以讓編譯器在預處理后停止,並輸出預處理結果。在本例中,預處理結果就是將stdio.h 文件中的內容插入到HelloWorld.c中了。


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


(2) $ gcc –S HelloWorld.i     

gcc的-S選項,表示在程序編譯期間,在生成匯編代碼后,停止,-o輸出匯編代碼文件。

查看下HelloWorld.s //生成匯編代碼后結束



(3)生成匯編代碼文件HelloWorld.s以后,需要gas匯編器負責將其編譯為目標文件,如下:

$ gcc –c HelloWorld.c
或者:
$ gcc -c HelloWorld.c –o HelloWorld.o
或者:
$ gcc -c HelloWorld.i -o HelloWorld.o

//編譯結束
//生成 HelloWorld.o文件


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

gcc連接器是gas提供的,負責將程序的目標文件與所需的所有附加的目標文件連接起來,最終生成可執行文件。

附加的目標文件包括靜態連接庫和動態連接庫。

對於上一小節中生成的HelloWorld.o,將其與C標准輸入輸出庫進行連接,最終生成程序HelloWorld可執行文件

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM