gcc初步窺探

中大黑熊發表於2014-04-29

       由於沒有上過Linux程式設計這門課,所以Linux學得很水啊!!用來用去都是ls -al ; cd .. ;這些渣命令,尤其gcc都不知道什麼東西來的,所以先學一下吧。

 

一.程式的編譯過程

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

https://i.iter01.com/images/c93684b5fd09ab8459a1b8996d256521d50ad1153c388c64df240d2109b735e4.jpg

 

在 預處理階段,輸入的是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常用模式

假設我們新建一個test.c,其內容為:

#include <stdio.h>

int main(){
    printf("Hello world!\n");
    return 0;
}

我們直接編譯連結生成模式:

dzhwen@deng:~$ gcc test.c -o test
dzhwen@deng:~$ ./test
Hello world!

生成機器碼模式:

dzhwen@deng:~$ gcc -c test.c 

重複命名格式:

dzhwen@deng:~$ gcc test.c -o mytest
dzhwen@deng:~$ ./mytest
Hello world!

聯合編譯連結生成模式:

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

該命令將同時編譯三個原始檔,即first.c、second.c和 third.c,然後將它們連線成一個可執行程式,名為test。

三.常見選項

許多情況下,標頭檔案和原始檔會單獨存放在不同的目錄中。例如,假設存放原始檔的子目錄名為./src,而包含檔案則放在層次的其他目錄下,如./inc。當我們在./src 目錄下進行編譯工作時,如何告訴GCC到哪裡找標頭檔案呢?方法如下所示:

$ gcc test.c –I../inc -o test

上面的命令告訴GCC包含檔案存放在./inc 目錄下,在當前目錄的上一級。如果在編譯時需要的包含檔案存放在多個目錄下,可以使用多個-I 來指定各個目錄:

$ gcc test.c –I../inc –I../../inc2 -o test

另外,我們還可以在編譯命令列中定義符號常量。為此,我們可以簡單的在命令列中使用-D選項即可,如下例所示:

$ gcc -d TEST_CONFIGURATION test.c -o test

檢視警告資訊:

$ gcc -Wall test.c -o test

 

 

四.常用的gcc命令

1. 無選項編譯連結

dzhwen@deng:~$ gcc test.c

作用:將test.c預處理、彙編、編譯並連結形成可執行檔案。這裡未指定輸出檔案,預設輸出為a.out。

 

2.選項 -o

dzhwen@deng:~$ gcc test.c -o test

作用:將test.c預處理、彙編、編譯並連結形成可執行檔案test。-o選項用來指定輸出檔案的檔名。

 

3. 選項-O

dzhwen@deng:~$ gcc -O1 test.c -o test

作用:使用編譯優化級別1編譯程式。級別為1~3,級別越大優化效果越好,但編譯時間越長。

 

4.多個檔案一起編譯。

dzhwen@deng:~$ gcc testfun.c test.c -o test

作用:將testfun.c和test.c分別編譯後連結成test可執行檔案。

 

g++的基本命令與gcc的基本命令基本相同,在這裡並不贅述。

關於makefile的學習,看這裡吧。

相關文章