gcc編譯器 CFLAGS 標誌引數說明

2021-07-10 05:58:50 字數 4137 閱讀 3885

gcc編譯器 cflags 標誌引數說明

2012-11-14 15:10:28

分類: linux

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] gcchello1.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

強行將函式

gcc編譯器 CFLAGS 標誌引數說明

cflags g o2 wall werror wno unused 編譯出現警告性錯誤unused but set variable,變數定義但沒有使用,解決方法 增加 cflags 或cppflags引數如下 cppflags werror wno unused but set variable...

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...