1. 程式人生 > >gcc常用編譯選項 彙總

gcc常用編譯選項 彙總

gcc提供了大量的警告選項,對程式碼中可能存在的問題提出警告,通常可以使用-Wall來開啟以下警告:
           -Waddress -Warray-bounds (only with -O2) -Wc++0x-compat
           -Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration
           -Wcomment -Wformat -Wmain (only for C/ObjC and unless
           -ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses
           -Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point
           -Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1
           -Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)
           -Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value
           -Wunused-variable
unused-function:警告宣告但是沒有定義的static函式;
unused- label:宣告但是未使用的標籤;
unused-parameter:警告未使用的函式引數;
unused-variable:宣告但是未使用的本地變數;
unused-value:計算了但是未使用的值;
format:printf和scanf這樣的函式中的格式字串的使用不當;
implicit-int:未指定型別;
implicit-function:函式在宣告前使用;
char- subscripts:使用char類作為陣列下標(因為char可能是有符號數);
missingbraces:大括號不匹配;
parentheses: 圓括號不匹配;
return-type:函式有無返回值以及返回值型別不匹配;
sequence-point:違反順序點的程式碼,比如 a[i] = c[i++];
switch:switch語句缺少default或者switch使用列舉變數為索引時缺少某個變數的case;
strict- aliasing=n:使用n設定對指標變數指向的物件型別產生警告的限制程度,預設n=3;只有在-fstrict-aliasing設定的情況下有效;
unknow-pragmas:使用未知的#pragma指令;
uninitialized:使用的變數為初始化,只在-O2時有效;

以下是在-Wall中不會啟用的警告選項:
cast-align:當指標進行型別轉換後有記憶體對齊要求更嚴格時發出警告;
sign- compare:當使用signed和unsigned型別比較時;
missing-prototypes:當函式在使用前沒有函式原型時;
packed:packed 是gcc的一個擴充套件,是使結構體各成員之間不留記憶體對齊所需的空間
,有時候會造成記憶體對齊的問題;
padded:也是gcc的擴充套件,使結構體成員之間進行記憶體對齊的填充,會造成結構體體積增大.
unreachable-code:有不會執行的程式碼時.
inline:當inline函式不再保持inline時 (比如對inline函式取地址);
disable-optimization:當不能執行指定的優化時.(需要太多時間或系統資源).
可以使用 -Werror時所有的警告都變成錯誤,使出現警告時也停止編譯.需要和指定警告的引數一起使用.

優化:
gcc預設提供了5級優化選項的集合:
-O0:無優化(預設)
-O和-O1:使用能減少目標檔案大小以及執行時間並且不會使編譯時間明顯增加的優化.在編譯大型程式的時候會顯著增加編譯時記憶體的使用.
-O2: 包含-O1的優化並增加了不需要在目標檔案大小和執行速度上進行折衷的優化.編譯器不執行迴圈展開以及函式內聯.此選項將增加編譯時間和目標檔案的執行效能.
-Os:專門優化目標檔案大小,執行所有的不增加目標檔案大小的-O2優化選項.並且執行專門減小目標檔案大小的優化選項.
-O3: 開啟所有-O2的優化選項並且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize優化選項.

-O1包含的選項-O1通常可以安全的和除錯的選項一起使用:
           -fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch
           -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion
           -finline-small-functions -fipa-pure-const -fipa-reference
           -fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch
           -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse
           -ftree-fre -ftree-sra -ftree-ter -funit-at-a-time

以下所有的優化選項需要在名字前加上-f,如果不需要此選項可以使用-fno-字首
defer-pop:延遲到只在必要時從函式引數棧中pop引數;
thread- jumps:使用跳轉執行緒優化,避免跳轉到另一個跳轉;
branch-probabilities:分支優化;
cprop- registers:使用暫存器之間copy-propagation傳值;
guess-branch-probability:分支預測;
omit- frame-pointer:可能的情況下不產生棧幀;

-O2:以下是-O2在-O1基礎上增加的優化選項:
           -falign-functions  -falign-jumps -falign-loops  -falign-labels
           -fcaller-saves -fcrossjumping -fcse-follow-jumps  -fcse-skip-blocks
           -fdelete-null-pointer-checks -fexpensive-optimizations -fgcse
           -fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove
           -freorder-blocks  -freorder-functions -frerun-cse-after-loop
           -fsched-interblock  -fsched-spec -fschedule-insns
           -fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre
           -ftree-vrp
cpu架構的優化選項,通常是-mcpu(將被取消);-march,-mtune

Debug選項:
在 gcc編譯原始碼時指定-g選項可以產生帶有除錯資訊的目的碼,gcc可以為多個不同平臺上帝不同調試器提供除錯資訊,預設gcc產生的除錯資訊是為 gdb使用的,可以使用-gformat 指定要生成的除錯資訊的格式以提供給其他平臺的其他偵錯程式使用.常用的格式有
-ggdb:生成gdb專用的除錯資訊,使用最適合的格式(DWARF 2,stabs等)會有一些gdb專用的擴充套件,可能造成其他偵錯程式無法執行.
-gstabs:使用 stabs格式,不包含gdb擴充套件,stabs常用於BSD系統的DBX偵錯程式.
-gcoff:產生COFF格式的除錯資訊,常用於System V下的SDB偵錯程式;
-gxcoff:產生XCOFF格式的除錯資訊,用於IBM的RS/6000下的DBX偵錯程式;
-gdwarf- 2:產生DWARF version2 的格式的除錯資訊,常用於IRIXX6上的DBX偵錯程式.GCC會使用DWARF version3的一些特性.
可以指定除錯資訊的等級:在指定的除錯格式後面加上等級:
如: -ggdb2 等,0代表不產生除錯資訊.在使用-gdwarf-2時因為最早的格式為-gdwarf2會造成混亂,所以要額外使用一個-glevel來指定除錯資訊的等級,其他格式選項也可以另外指定等級.

gcc可以使用-p選項指定生成資訊以供porf使用.