Gcc編譯選項分析

2021-07-14 18:07:11 字數 4218 閱讀 9126



gcc有超過100個的可用選項,主要包括總體選項、告警和出錯選項、優化選項和體系結構相關選項。以下對每一類中最常用的選項進行講解。

(1)總體選項

gcc的總結選項如表3.7所示,很多在前面的示例中已經有所涉及。

表3.7 gcc總體選項列表

字尾名所對應的語言

-c只是編譯不鏈結,生成目標檔案「.o」

-s只是編譯不彙編,生成彙編**

-e只進行預編譯,不做其他處理

-g在可執行程式中包含標準除錯資訊

-o file

把輸出檔案輸出到file裡

-v列印出編譯器內部編譯各過程的命令列資訊和編譯器的版本

-i dir

在標頭檔案的搜尋路徑列表中新增dir目錄

-l dir

在庫檔案的搜尋路徑列表中新增dir目錄

-static

鏈結靜態庫

-llibrary

連線名為library的庫檔案

對於「-c」、「-e」、「-o」、「-s」選項在前一小節中已經講解了其使用方法,在此主要講解另外兩個非常常用的庫依賴選項「-i dir」和「-l dir」。

· 「-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] 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所示。

表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所示。

表3.9gcc體系結構相關選項列表

選項含義

-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編譯選項

gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...

gcc 編譯選項

gcc 編譯選項,自己翻譯的.gcc 編譯選項,自己翻譯的.o 設定輸出檔名 c 只編譯,不連線.e 只做預編譯.pipe 在多個編譯過程之間使用管道.version 顯示版本.static 靜態連線.ansi c 模式下支援所有 iso c90 標準的 c 程式,c 模式下去除對 gnu c 擴充...

gcc 編譯選項

wall 大部分警告 wextra 一些額外的警告 werror 當出現警告時轉為錯誤,停止編譯 wconversion 一些可能改變值的隱式轉換,給出警告。wno unused parameter 函式中出現未使用的引數,不給出警告。wold style cast c風格的轉換,給出警告 wove...