gcc對文件的處理需要經過預處理->編譯->匯編->鏈接的步驟,從而產生一個可執行文件,各部分對應不同的文件類型,具體如下:
file.c      c程序源文件
file.i       c程序預處理后文件
file.cxx   c++程序源文件,也可以是file.cc / file.cpp / file.c++
file.ii      c++程序預處理后文件
file.h      c/c++頭文件
file.s      匯編程序文件
file.o      目標代碼文件

gcc [選項] 文件列表
-ansi        強制完全ANSI一致
-c           僅編譯或匯編,生成目標代碼文件,將.c、.i、.s等文件生成.o文件,其余文件被忽略
-S           僅編譯,不進行匯編和鏈接,將.c、.i等文件生成.s文件,其余文件被忽略
-E           僅預處理,并發送預處理后的.i文件到標準輸出,其余文件被忽略
-o file      創建可執行文件并保存在file中,而不是默認文件a.out
-g           產生用于調試和排錯的擴展符號表,用于GDB調試,切記-g和-O通常不能一起使用
-w           取消所有警告
-W           給出更詳細的警告
-O 
[num]     優化,可以指定0-3作為優化級別,級別0表示沒有優化
-x language  默認為-x none,即依靠后綴名確定文件類型,加上-x lan確定后面所有文件類型,直到下一個-x出現為止
-D macro
[=]  類似于源程序里的#define,在-D macro中的macro可被源程序識別,例如gcc -D NUM -D FILE=\"bbs.txt\" hello.c -o hello,第一個-D選項定義宏NUM,在程序中可以使用#ifdef來檢查是否被設置,第二個-D定義宏FILE,在源程序中可用
-U macro     類似于源程序開頭定義#undef macro,也就是取消源程序中的某個宏定義
-I dir       將dir目錄加到搜尋頭文件的目錄中去,并優先于gcc中缺省的搜索目錄,有多個-I選項時,按照出現順序搜索
-L dir       將dir目錄加到搜索-lname選項指定的函數庫文件的目錄列表中去,并優先于gcc缺省的搜索目錄,有多個-L選項時,按照出現順序搜索
-lname       在鏈接時使用函數庫libname.a,鏈接程序在-L dir指定的目錄和/lib、/usr/lib目錄下尋找該庫文件,在沒有使用-static選項時,如果發現共享函數庫libname.so,則使用libname.so進行動態鏈接        
-fPIC        產生位置無關的目標代碼,可用于構造共享函數庫
-static      禁止與共享函數庫鏈接
-shared      盡量與共享函數庫鏈接(默認)


以下是從某些博客中摘錄的使用例子:
http://hi.baidu.com/eng_cheng/blog/item/37c2f3aee20a79c47dd92ab2.html

1.編譯單個文件
vi hello.c               //創建源文件hello.c
gcc -o hello hello.c  //編譯為可執行文件hello,在默認情況下產生的可執行文件名為a.out
./hello                  //執行文件,如果只寫hello是錯誤的,因為系統會將hello當指令來執行,然后報錯

2.編譯多個源文件
vi message.c
gcc -c message.c         //輸出message.o文件,是一個已編譯的目標代碼文件
vi main.c
gcc -c main.c            //輸出main.o文件
gcc -o all main.o message.o    //執行連接階段的工作,然后生成all可執行文件
./all
注意:gcc對如何將多個源文件編譯成一個可執行文件有內置的規則,所以前面的多個單獨步驟可以簡化為一個命令。
vi message.c
vi main.c
gcc -o all message.c main.c
./all

3.使用外部函數庫
GCC常常與包含標準例程的外部軟件庫結合使用,幾乎每一個linux應用程序都依賴于GNU C函數庫GLIBC。
vi trig.c
gcc -o trig -lm trig.c
GCC的-lm選項,告訴GCC查看系統提供的數學庫libm。函數庫一般會位于目錄/lib或者/usr/lib中。

4.共享函數庫和靜態函數庫
靜態函數庫:每次當應用程序和靜態連接的函數庫一起編譯時,任何引用的庫函數的代碼都會被直接包含進最終二進制程序。
共享函數庫:包含每個庫函數的單一全局版本,它在所有應用程序之間共享。
vi message.c
vi hello.c
gcc -c hello.c
gcc -fPIC -c message.c
gcc -shared -o libmessge.so message.o
其中,PIC命令行標記告訴GCC產生的代碼不要包含對函數和變量具體內存位置的引用,這是因為現在還無法知道使用該消息代碼的應用程序會將它鏈接到哪一段地址空間。這樣編譯輸出的文件message.o可以被用于建立共享函數庫。-shared標記將某目標代碼文件變換成共享函數庫文件。
gcc -o all -lmessage -L. hello.o
-lmessage標記來告訴GCC在連接階段使用共享數據庫libmessage.so,-L.標記告訴GCC函數庫可能在當前目錄中,首先查找當前目錄,否則GCC連接器只會查找系統函數庫目錄,在本例情況下,就找不到可用的函數庫了。