GCC 入門

通常所說的GCC是GUN Compiler Collection的簡稱,除了編譯程序之外,它還含其他相關工具,所以它能把易於人類使用的高級語言編寫的源代碼構建成計算機能夠直接執行的二進制代碼。GCC是Linux平臺下最常用的編譯程序,它是Linux平臺編譯器的事實標準。同時,在Linux平臺下的嵌入式開發領域,GCC也是用得最普遍的一種編譯器。GCC之所以被廣泛採用,是因爲它能支持各種不同的目標體系結構。例如,它既支持基於宿主的開發(簡單講就是要爲某平臺編譯程序,就在該平臺上編譯),也支持交叉編譯(即在A平臺上編譯的程序是供平臺B使用的)。目前,GCC支持的體系結構有四十餘種,常見的有X86系列、Arm、PowerPC等。同時,GCC還能運行在不同的操作系統上,如Linux、Solaris、Windows等。

GCC ·詳解GCC的下載和安裝
·Linux編程起步 GCC基本用法

除了上面講的之外,GCC除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。

本系列文章中,我們不僅介紹GCC的基本功能,還涉及到一些諸如優化之類的高級功能。另外,我們還考察GCC的一些映像操作工具,如size和objcopy等,這將在後續的文章中加以介紹。

二、程序的編譯過程

對於GUN編譯器來說,程序的編譯要經歷預處理、編譯、彙編、連接四個階段,如下圖所示:

     

從功能上分,預處理、編譯、彙編是三個不同的階段,但GCC的實際操作上,它可以把這三個步驟合併爲一個步驟來執行。下面我們以C語言爲例來談一下不同階段的輸入和輸出情況。

在預處理階段,輸入的是C語言的源文件,通常爲*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理源文件中的#ifdef、 #include和#define命令。該階段會生成一箇中間文件*.i,但實際工作中通常不用專門生成這種文件,因爲基本上用不到;若非要生成這種文件不可,可以利用下面的示例命令:

gcc -E  test.c -o test.i

在編譯階段,輸入的是中間文件*.i,編譯後生成彙編語言文件*.s 。這個階段對應的GCC命令如下所示:

GCC -S test.i -o test.s

在彙編階段,將輸入的彙編文件*.s轉換成機器語言*.o。這個階段對應的GCC命令如下所示:

GCC -c test.s -o test.o

最後,在連接階段將輸入的機器代碼文件*.s(與其它的機器代碼文件和庫文件)彙集成一個可執行的二進制代碼文件。這一步驟,可以利用下面的示例命令完成:

GCC test.o -o test

上面介紹了GCC編譯過程的四個階段以及相應的命令。下面我們進一步介紹常用的GCC的模式。

三、GCC常用模式

這裏介紹GCC追常用的兩種模式:編譯模式和編譯連接模式。下面以一個例子來說明各種模式的使用方法。爲簡單起見,假設我們全部的源代碼都在一個文件test.c中,要想把這個源文件直接編譯成可執行程序,可以使用以下命令:

$ GCC -o test

這裏test.c是源文件,生成的可執行代碼存放在一個名爲test 的文件中(該文件是機器代碼並且可執行)。-o 是生成可執行文件的輸出選項。如果我們只想讓源文件生成目標文件(給文件雖然也是機器代碼但不可執行),可以使用標記-c ,詳細命令如下所示:

$ GCC -c test.c

默認情況下,生成的目標文件被命名爲test.o,但我們也可以爲輸出文件指定名稱,如下所示:

$ GCC -c test.c -o

上面這條命令將編譯後的目標文件命名爲mytest.o,而不是默認的test.o。

迄今爲止,我們談論的程序僅涉及到一個源文件;現實中,一個程序的源代碼通常包含在多個源文件之中,這該怎麼辦?沒關係,即使這樣,用GCC處理起來也並不複雜,見下例:

$ GCC -o test  first.c second.c third.c

該命令將同時編譯三個源文件,即first.c、second.c和 third.c,然後將它們連接成一個可執行程序,名爲test。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章