轉自:http://blog.chinaunix.net/uid-20672257-id-3408132.html
增加
Gcc總體選項列表
后 綴 名 |
所對應的語言 |
-S |
只是編譯不匯編,生成匯編代碼 |
-E |
只進行預編譯,不做其他處理 |
-g |
在可執行程序中包含標准調試信息 |
-o file |
把輸出文件輸出到file里 |
-v |
打印出編譯器內部編譯各過程的命令行信息和編譯器的版本 |
-I dir |
在頭文件的搜索路徑列表中添加dir目錄 |
-L dir |
在庫文件的搜索路徑列表中添加dir目錄 |
-static |
鏈接靜態庫 |
-llibrary |
連接名為library的庫文件 |
· “-I dir”
正如上表中所述,“-I dir”選項可以在頭文件的搜索路徑列表中添加dir目錄。由於Linux中頭文件都默認放到了“/usr/include/”目錄下,因此,當用戶希望添加放置在其他位置的頭文件時,就可以通過“-I dir”選項來指定,這樣,Gcc就會到相應的位置查找對應的目錄。
比如在“/root/workplace/Gcc”下有兩個文件:
#include
int main()
{
printf(“Hello!!\n”);
return 0;
}
#include
這樣,就可在Gcc命令行中加入“-I”選項:
[root@localhost Gcc] Gcc hello1.c –I /root/workplace/Gcc/ -o hello1
這樣,Gcc就能夠執行出正確結果。
小知識
在include語句中,“<>”表示在標准路徑中搜索頭文件,““””表示在本目錄中搜索。故在上例中,可把hello1.c的“#include”改為“#include “my.h””,就不需要加上“-I”選項了。
· “-L dir”
選項“-L dir”的功能與“-I dir”類似,能夠在庫文件的搜索路徑列表中添加dir目錄。例如有程序hello_sq.c需要用到目錄“/root/workplace/Gcc/lib”下的一個動態庫libsunq.so,則只需鍵入如下命令即可:
[root@localhost Gcc] Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq
需要注意的是,“-I dir”和“-L dir”都只是指定了路徑,而沒有指定文件,因此不能在路徑中包含文件名。
另外值得詳細解釋一下的是“-l”選項,它指示Gcc去連接庫文件libsunq.so。由於在Linux下的庫文件命名時有一個規定:必須以lib三個字母開頭。因此在用-l選項指定鏈接的庫文件名時可以省去lib三個字母。也就是說Gcc在對”-lsunq”進行處理時,會自動去鏈接名為libsunq.so的文件。
(2)告警和出錯選項
Gcc的告警和出錯選項如表3.8所示。
Gcc總體選項列表
選 項 |
含 義 |
-ansi | 支持符合ANSI標准的C程序 |
-pedantic | 允許發出ANSI C標准所列的全部警告信息 |
-pedantic-error | 允許發出ANSI C標准所列的全部錯誤信息 |
-w | 關閉所有告警 |
-Wall | 允許發出Gcc提供的所有有用的報警信息 |
-werror | 把所有的告警信息轉化為錯誤信息,並在告警發生時終止編譯過程 |
下面結合實例對這幾個告警和出錯選項進行簡單的講解。
如有以下程序段:
#include
void main()
{
long long tmp = 1;
printf(“This is a bad code!\n”);
return 0;
}
這是一個很糟糕的程序,讀者可以考慮一下有哪些問題?
· “-ansi”
該選項強制Gcc生成標准語法所要求的告警信息,盡管這還並不能保證所有沒有警告的程序都是符合ANSI C標准的。運行結果如下所示:
[root@localhost Gcc]# Gcc –ansi warning.c –o warning
warning.c: 在函數“main”中:
warning.c:7 警告:在無返回值的函數中,“return”帶返回值
warning.c:4 警告:“main”的返回類型不是“int”
可以看出,該選項並沒有發現”long long”這個無效數據類型的錯誤。
· “-pedantic”
允許發出ANSI C標准所列的全部警告信息,同樣也保證所有沒有警告的程序都是符合ANSI C標准的。其運行結果如下所示:
[root@localhost Gcc]# Gcc –pedantic warning.c –o warning
warning.c: 在函數“main”中:
warning.c:5 警告:ISO C90不支持“long long”
warning.c:7 警告:在無返回值的函數中,“return”帶返回值
warning.c:4 警告:“main”的返回類型不是“int”
可以看出,使用該選項查看出了”long long”這個無效數據類型的錯誤。
· “-Wall”
允許發出Gcc能夠提供的所有有用的報警信息。該選項的運行結果如下所示:
[root@localhost Gcc]# Gcc –Wall warning.c –o warning
warning.c:4 警告:“main”的返回類型不是“int”
warning.c: 在函數”main”中:
warning.c:7 警告:在無返回值的函數中,”return”帶返回值
warning.c:5 警告:未使用的變量“tmp”
使用“-Wall”選項找出了未使用的變量tmp,但它並沒有找出無效數據類型的錯誤。
另外,Gcc還可以利用選項對單獨的常見錯誤分別指定警告,有關具體選項的含義感興趣的讀者可以查看Gcc手冊進行學習。
(3)優化選項
Gcc可以對代碼進行優化,它通過編譯選項“-On”來控制優化代碼的生成,其中n是一個代表優化級別的整數。對於不同版本的Gcc來講,n的取值范圍及其對應的優化效果可能並不完全相同,比較典型的范圍是從0變化到2或3。
不同的優化級別對應不同的優化處理工作。如使用優化選項“-O”主要進行線程跳轉(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優化。使用優化選項“-O2”除了完成所有“-O1”級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項“-O3”則還包括循環展開和其他一些與處理器特性相關的優化工作。
雖然優化選項可以加速代碼的運行速度,但對於調試而言將是一個很大的挑戰。因為代碼在經過優化之后,原先在源程序中聲明和使用的變量很可能不再使用,控制流也可能會突然跳轉到意外的地方,循環語句也有可能因為循環展開而變得到處都有,所有這些對調試來講都將是一場噩夢。所以筆者建議在調試的時候最好不使用任何優化選項,只有當程序在最終發行的時候才考慮對其進行優化。
(4)體系結構相關選項
Gcc的體系結構相關選項如表3.9所示。
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返回,節省調用函數的一條指令 |