cflags = -g -o2 -wall -werror -wno-unused
編譯出現警告性錯誤unused-but-set-variable,變數定義但沒有使用,解決方法: 增加
cflags 或cppflags引數如下:
cppflags=" -werror -wno-unused-but-set-variable" || exit 1
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()
#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()
這是乙個很糟糕的程式,讀者可以考慮一下有哪些問題?
· 「-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返回,節省呼叫函式的一條指令
gcc編譯器 CFLAGS 標誌引數說明
gcc編譯器 cflags 標誌引數說明 2012 11 14 15 10 28 分類 linux cflags g o2 wall werror wno unused 編譯出現警告性錯誤unused but set variable,變數定義但沒有使用,解決方法 增加 cflags 或cppfla...
gcc編譯器CFLAGS標誌引數說明
1,警告與出錯選項 ansi 支援符合ansi標準的c程式 pedantic 允許發出ansi c標準所列的全部警告資訊 pedantic error 允許發出ansi c標準所列的全部錯誤資訊 w 關閉所有警告 wall 允許發出gcc提供的所有有用的報警資訊 werror 把所有警告資訊轉為錯誤...
gcc編譯器簡介
在linux中選擇gcc編譯器的原因是gcc執行效率高。gcc基本用法 gcc options filename 其中options為編譯選項。例子 執行指令 gcc hello.c 則對hello.c進行編譯,如果程式沒有語法錯誤,則產生可執行檔案a.out gcc預設檔名 執行可執行檔案指令 a...