參考http://www.cublog.cn/u3/109488/showart_2138960.html
常用編譯選項: -o filename 把輸出文件輸出到 filename 裏 -E只進行預編譯,不做其他處理 -S 只是編譯不彙編,生成彙編代碼 -c 只是編譯不鏈接,生成目標文件“.o” -g 在可執行程序中包含標準調試信息,可以由GDB調用來調試 -v 打印出編譯器內部編譯各過程的命令行信息和編譯器的版本 -I dir 在頭文件的搜索路徑列表中添加 dir 目錄 -L dir 在庫文件的搜索路徑列表中添加 dir 目錄 -static 鏈接靜態庫 -lname通過這個參數連接名爲 libname.so 或者libname.a的庫文件 -Dmarco 在編譯時加入名爲marco的宏 |
GCC常用格式
gcc [參數選項] 編譯文件 [選項] [輸出文件] |
-E: 只進行預編譯,不做其他處理
[root@localhost gccinfo]# gcc -E test.c -o test.i |
-S: 只是編譯不彙編,生成彙編代碼
[root@localhost gccinfo]# gcc -S test.i -o test.s |
-c:只是編譯不鏈接,生成目標文件“.o”
[root@localhost gccinfo]# gcc -c test.s -o test.o |
-g:在可執行程序中包含標準調試信息,可以由GDB調用來調試。
[root@localhost gccinfo]# gcc -g test.c -o test |
那麼可執行文件test將包含了標準的調試信息,可以由GDB調用來調試。
-v:打印出編譯器內部編譯各過程的命令行信息和編譯器的版本
[root@localhost gccinfo]# gcc -v test.c -o test |
-I dir:在頭文件的搜索路徑列表中添加 dir 目錄
頭文件路徑:一般在編譯文件的當前目錄下尋找,如果沒有則在/usr/include/下尋找。
在當前目錄下查找的頭文件一般用雙引號引起,而用<>的頭文件則在默認目錄下查找。
1 #include <stdio.h> // 在標準路徑中查找 2 #include "myfun.h" // 在本文件當前目錄中查找,或者在-I指定的目錄中查找 3 int main(void) 4 { 5 printf("Hello World!/n"); 6 return 0; 7 } |
通過-I+路徑來指定,如-I/usr/local/include/
[root@localhost gccinfo]# gcc test.c -I/usr/local/ -o test |
-L dir: 在庫文件的搜索路徑列表中添加 dir 目錄
-lname: 通過這個參數連接名爲 libname.so 或者libname.a的庫文件。Linux下庫的命名有一個規定,則必須要用lib開頭,那麼-l選項後的參數name則是函數庫libxxxx去掉xxxx的名字,不包括後綴.so或者.a。
函數庫路徑:一般在/usr/lib/, /lib/, /usr/local/lib下尋找。需要特別指定的可以用-L dir選項來制定路徑。
假設有個名爲libfoo.so文件在/tmp下,那麼編譯時應該:
[root@localhost gccinfo]# gcc test.c -L/tmp -lfoo -o test |
庫文件的後綴:.so 表示的動態庫文件; .a表示的是靜態庫文件。GCC在默認情況下優先選擇.so的動態庫文件來連接。意思是如果有兩個文件:libfoo.so與libfoo.a在/tmp目錄下,當執行下面命令時:
[root@localhost gccinfo]# gcc test.c -L/tmp -lfoo -o test |
編譯器會自動連接libfoo.so這個文件。
-Dmarco:在編譯時加入名爲marco的宏
以文件ma.c來說明:
1 #include <stdio.h> 2 3 int main(void) 4 { 5 #ifdef __DEBUG__ 6 printf("DEBUG/n"); 7 #endif 8 printf("Hello World!/n"); 9 return 0; 10 } |
首先執行下面命令並觀察結果:
[root@localhost gccinfo]# gcc ma.c -o ma [root@localhost gccinfo]# ./ma Hello World! |
在觀察帶有-D選項的編譯結果:
[root@localhost gccinfo]# gcc -D__DEBUG__ ma.c -o ma [root@localhost gccinfo]# ./ma DEBUG Hello World! |
對比可以知道-Dmarco相當於在編譯的源文件中加上了一句#define marco
告警和出錯選項: -ansi 支持符合 ANSI 標準的 C 程序 -pedantic 允許發出 ANSI C 標準所列的全部警告信息 -pedantic-error 允許發出 ANSI C 標準所列的全部錯誤信息 -w 閉所有告警 -Wall 允許發出 Gcc 提供的所有有用的報警信息 -werror 把所有的告警信息轉化爲錯誤信息,並在告警發生時終止編譯過程 |
現在已文件warning.c來說明
1 #include <stdio.h> 2 void main(void) 3 { 4 long long a=1; 5 return 0; 6 } |
-ansi:該選項強制 GCC 生成標準語法所要求的告警信息,儘管這還並不能保證所有沒有警告的程序都是符合 ANSI C 標準的。運行結果如下所示:
[root@localhost gccinfo]# gcc -ansi warning.c -o waring warning.c: In function `main': warning.c:5: warning: `return' with a value, in function returning void warning.c:3: warning: return type of `main' is not `int' |
可以看出,該選項並沒有發現“long long”這個無效數據類型的錯誤。
-pedantic:允許發出 ANSI C 標準所列的全部警告信息,同樣也保證所有沒有警告的程序都是符合ANSI C 標準的。其運行結果如下所示:
[root@localhost gccinfo]# gcc -pedantic warning.c -o waring warning.c: In function `main': warning.c:4: warning: ISO C90 does not support `long long' warning.c:5: warning: `return' with a value, in function returning void warning.c:3: warning: return type of `main' is not `int' |
可以看出,使用該選項查看出了“long long”這個無效數據類型的錯誤。
-Wall 允許發出 Gcc 提供的所有有用的報警信息
[root@localhost gccinfo]# gcc -Wall warning.c -o waring warning.c:2: warning: return type of `main' is not `int' warning.c: In function `main': warning.c:5: warning: `return' with a value, in function returning void warning.c:4: warning: unused variable `a' |
GCC編譯器優化選項: GCC 可以對代碼進行優化,它通過編譯選項“-On”來控制優化代碼的生成,其中 n 是一個代表優化級別的整數。對於不同版本的 Gcc 來講,n 的取值範圍及其對應的優化效果可能並不完全相同,比較典型的範圍是從 0 變化到 2 或 3。不同的優化級別對應不同的優化處理工作。如使用優化選項“-O”主要進行線程跳轉(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優化。使用優化選項“-O2”除了完成所有“-O1”級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項“-O3”則還包括循環展開和其他一些與處理器特性相關的優化工作。雖然優化選項可以加速代碼的運行速度,但對於調試而言將是一個很大的挑戰。因爲代碼在經過優化之後,原先在源程序中聲明和使用的變量很可能不再使用,控制流也可能會突然跳轉到意外的地方,循環語句也有可能因爲循環展開而變得到處都有,所有這些對調試來講都將是一場噩夢。所以筆者建議在調試的時候最好不使用任何優化選項,只有當程序在最終發行的時候才考慮對其進行優化。 |
GCC體系結構相關選項: -mcpu=type 針對不同的 CPU 使用相應的 CPU 指令。可選擇的 type 有 i386、i486、pentium 及 i686 等 -mieee-fp 使用 IEEE 標準進行浮點數的比較 -mno-ieee-fp 不使用 IEEE 標準進行浮點數的比較 -msoft-float 輸出包含浮點庫調用的目標代碼 -mshort 把 int 類型作爲 16 位處理,相當於 short int -mrtd 強行將函數參數個數固定的函數用 ret NUM 返回,節省調用函數的一條指令 |