由於沒有上過Linux程式設計這門課,所以Linux學得很水啊!!用來用去都是ls -al ; cd .. ;這些渣命令,尤其gcc都不知道什麼東西來的,所以先學一下吧。
一.程式的編譯過程
對於GUN編譯器來說,程式的編譯要經歷預處理、編譯、彙編、連線四個階段,如下圖所示:
在 預處理階段,輸入的是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的學習,看這裡吧。