日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

GCC 編譯選項(xiàng)

 rookie 2012-10-10

gcc 提供了大量的警告選項(xiàng),對(duì)代碼中可能存在的問題提出警 告,通??梢允褂?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函數(shù);
unused- label:聲明但是未使用的標(biāo)簽;
unused-parameter:警告未使用的函數(shù)參數(shù);
unused-variable:聲明但 是未使用的本地變量;
unused-value:計(jì)算了但是未使用的值;
format:printf和scanf這樣的函數(shù)中的格式字符 串的使用不當(dāng);
implicit-int:未指定類型;
implicit-function:函數(shù)在聲明前使用;
char- subscripts:使用char類作為數(shù)組下標(biāo)(因?yàn)閏har可能是有符號(hào)數(shù));
missingbraces:大括號(hào)不匹配;
parentheses: 圓括號(hào)不匹配;
return-type:函數(shù)有無返回值以及返回值類型不匹配;
sequence-point:違反順序點(diǎn)的代碼,比如 a[i] = c[i++];
switch:switch語句缺少default或者switch使用枚舉變量為索引時(shí)缺少某個(gè)變量的case;
strict- aliasing=n:使用n設(shè)置對(duì)指針變量指向的對(duì)象類型產(chǎn)生警告的限制程度,默認(rèn)n=3;只有在-fstrict-aliasing設(shè)置的情況下有 效;
unknow-pragmas:使用未知的#pragma指令;
uninitialized:使用的變量為初始化,只在-O2時(shí)有 效;
以下是在-Wall中不會(huì)激活的警告選項(xiàng):
cast-align:當(dāng)指針進(jìn)行類型轉(zhuǎn)換后有內(nèi)存對(duì)齊要求更嚴(yán)格時(shí)發(fā)出警告;
sign- compare:當(dāng)使用signed和unsigned類型比較時(shí);
missing-prototypes:當(dāng)函數(shù)在使用前沒有函數(shù)原型時(shí);
packed:packed 是gcc的一個(gè)擴(kuò)展,是使結(jié)構(gòu)體各成員之間不留內(nèi)存對(duì)齊所需的空 間 ,有時(shí)候會(huì)造成內(nèi)存對(duì)齊的問題;
padded:也是gcc的擴(kuò)展,使結(jié)構(gòu)體成員之間進(jìn)行內(nèi)存對(duì)齊的填充,會(huì) 造成結(jié)構(gòu)體體積增大.
unreachable-code:有不會(huì)執(zhí)行的代碼時(shí).
inline:當(dāng)inline函數(shù)不再保持inline時(shí) (比如對(duì)inline函數(shù)取地址);
disable-optimization:當(dāng)不能執(zhí)行指定的優(yōu)化時(shí).(需要太多時(shí)間或系統(tǒng) 資源).
可以使用 -Werror時(shí)所有的警告都變成錯(cuò)誤,使出現(xiàn)警告時(shí)也停止編譯.需要和指定警告的參數(shù)一起使用.
優(yōu)化:
gcc默認(rèn)提供了5級(jí)優(yōu) 化選項(xiàng)的集合:
-O0:無優(yōu)化(默認(rèn))
-O和-O1:使用能減少目標(biāo)文 件 大小以及執(zhí)行時(shí)間并且不會(huì)使編譯時(shí)間明顯增加的優(yōu)化.在編譯大型程序的時(shí)候會(huì)顯著增加編譯時(shí)內(nèi)存的使用.
-O2: 包含-O1的優(yōu)化并增加了不需要在目標(biāo)文件大小和執(zhí)行速度上進(jìn)行折衷的優(yōu)化.編譯器不執(zhí)行循環(huán)展開以及函數(shù)內(nèi)聯(lián).此選項(xiàng)將增加編譯時(shí)間和目標(biāo)文件的執(zhí)行性 能.
-Os:專門優(yōu)化目標(biāo)文件大小,執(zhí)行所有的不增加目標(biāo)文件大小的-O2優(yōu)化選項(xiàng).并且執(zhí)行專門減小目標(biāo)文件大小的優(yōu)化選項(xiàng).
-O3: 打開所有-O2的優(yōu)化選項(xiàng)并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize優(yōu)化選項(xiàng).
-O1包含的選項(xiàng)-O1通常可以安全的和調(diào)試的選項(xiàng)一起使用:
           -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
以下所有的優(yōu)化選項(xiàng)需要在名字 前加上-f,如果不需要此選項(xiàng)可以使用-fno-前綴
defer-pop:延遲到只在必要時(shí)從函數(shù)參數(shù)棧中pop參數(shù);
thread- jumps:使用跳轉(zhuǎn)線程優(yōu)化,避免跳轉(zhuǎn)到另一個(gè)跳轉(zhuǎn);
branch-probabilities:分支優(yōu)化;
cprop- registers:使用寄存器之間copy-propagation傳值;
guess-branch-probability:分支預(yù)測;
omit- frame-pointer:可能的情況下不產(chǎn)生棧幀;
-O2:以下是-O2在-O1基礎(chǔ)上增加的優(yōu)化選項(xiàng):
           -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架構(gòu)的優(yōu)化選項(xiàng),通常是-mcpu(將被取消);-march,-mtune
Debug選項(xiàng):
在 gcc編譯源代碼時(shí)指定-g選項(xiàng)可以產(chǎn)生帶有調(diào)試信息的目標(biāo)代碼,gcc可以為多個(gè)不同平臺(tái)上帝不同調(diào)試器提供調(diào)試信息,默認(rèn)gcc產(chǎn)生的調(diào)試信息是為 gdb使用的,可以使用-gformat 指定要生成的調(diào)試信息的格式以提供給其他平臺(tái)的其他調(diào)試器使用.常用的格式有
-ggdb:生成gdb專 用的調(diào)試信息,使用最適合的格式(DWARF 2,stabs等)會(huì)有一些gdb專用的擴(kuò)展,可能造成其他調(diào)試器無法運(yùn)行.
-gstabs:使用 stabs格式,不包含gdb擴(kuò)展,stabs常用于BSD系統(tǒng)的DBX調(diào)試器.
-gcoff:產(chǎn)生COFF格式的調(diào)試信息,常用于System V下的SDB調(diào)試器;
-gxcoff:產(chǎn)生XCOFF格式的調(diào)試信息,用于IBM的RS/6000下的DBX調(diào)試器;
-gdwarf- 2:產(chǎn)生DWARF version2 的格式的調(diào)試信息,常用于IRIXX6上的DBX調(diào)試器.GCC會(huì)使用DWARF version3的一些特性.
可 以指定調(diào)試信息的等級(jí):在指定的調(diào)試格式后面加上等級(jí):
如: -ggdb2 等,0代表不產(chǎn)生調(diào)試信息.在使用-gdwarf-2時(shí)因?yàn)樽钤绲母袷綖?gdwarf2會(huì)造成混亂,所以要額外使用一個(gè)-glevel來指定調(diào)試信息的 等級(jí),其他格式選項(xiàng)也可以另外指定等級(jí).
gcc可以使用-p選項(xiàng)指定生成信息以供porf使用.

GCC常用選項(xiàng)

選項(xiàng)
含義

--help
--target-help
顯示 gcc 幫助說明?!畉arget-help’是顯示目標(biāo)機(jī)器特定的命令行選項(xiàng)。

--version
顯示 gcc 版本號(hào)和版權(quán)信息 。

-o outfile
輸出到指定的文件。

-x language
指明使用的編程語言。允許的語言包括:c c++ assembler none 。 ‘none’意味著恢復(fù)默認(rèn)行為,即根據(jù)文件的擴(kuò)展名猜測源文件的語言。

-v
打印較多信息,顯示編譯器調(diào)用的程序。

-###
與 -v 類似,但選項(xiàng)被引號(hào)括住,并且不執(zhí)行命令。

-E
僅作預(yù)處理,不進(jìn)行編譯、匯編和鏈接。如上圖所示。

-S
僅編譯到匯編語言,不進(jìn)行匯編和鏈接。如上圖所示。

-c
編譯、匯編到目標(biāo)代碼,不進(jìn)行鏈接。如上圖所示。

-pipe
使用管道代替臨時(shí)文件。

-combine
將多個(gè)源文件一次性傳遞給匯編器。

3 其他GCC選項(xiàng)

更多有用的GCC選項(xiàng):

命令
描述

-l library
-llibrary
進(jìn)行鏈接時(shí)搜索名為library的庫。
例子: $ gcc test.c -lm -o test

-Idir
dir 加入到搜索頭文件的路徑列表中。
例子: $ gcc test.c -I../inc -o test

-Ldir
dir 加入到搜索庫文件的路徑列表中。
例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test

-Dname
預(yù)定義一個(gè)名為name 的宏,值為1。
例子: $ gcc -DTEST_CONFIG test.c -o test

-Dname =definition
預(yù)定義名為name ,值為definition 的宏。

-ggdb
-ggdblevel
為調(diào)試器 gdb 生成調(diào)試信息。level 可以為1,2,3,默認(rèn)值為2。

-g
-glevel
生成操作系統(tǒng)本地格式的調(diào)試信息。-g 和 -ggdb 并不太相同, -g 會(huì)生成 gdb 之外的信息。level 取值同上。

-s
去除可執(zhí)行文件中的符號(hào)表和重定位信息。用于減小可執(zhí)行文件的大小。

-M
告 訴預(yù)處理器輸出一個(gè)適合make的規(guī)則,用于描述各目標(biāo)文件的依賴關(guān)系。對(duì)于每個(gè) 源文件,預(yù)處理器輸出 一個(gè)make規(guī)則,該規(guī)則的目標(biāo)項(xiàng)(target)是源文件對(duì)應(yīng)的目標(biāo)文件名,依賴項(xiàng)(dependency)是源文件中 `#include引用的所有文件。生成的規(guī)則可 以是單行,但如果太長,就用`\'-換行符續(xù)成多行。規(guī)則 顯示在標(biāo)準(zhǔn)輸出,不產(chǎn)生預(yù)處理過的C程序。

-C
告訴預(yù)處理器不要丟棄注釋。配合`-E'選項(xiàng)使用。

-P
告訴預(yù)處理器不要產(chǎn)生`#line'命令。配合`-E'選項(xiàng)使用。

-static
在支持動(dòng)態(tài)鏈接的系統(tǒng)上,阻止連接共享庫。該選項(xiàng)在其它系統(tǒng)上 無效。

-nostdlib
不連接系統(tǒng)標(biāo)準(zhǔn)啟動(dòng)文件和標(biāo)準(zhǔn)庫文件,只把指定的文件傳遞給連接器。

Warnings

-Wall
會(huì)打開一些很有用的警告選項(xiàng),建議編譯時(shí)加此選項(xiàng)。

-W
-Wextra
打印一些額外的警告信息。

-w
禁止顯示所有警告信息。

-Wshadow
當(dāng)一個(gè)局部變量遮蓋住了另一個(gè)局部變量,或者全局變量時(shí),給出警告。很有用的選項(xiàng),建議打開。 -Wall 并不會(huì)打開此項(xiàng)。

-Wpointer-arith
對(duì)函數(shù)指針或者void *類型的指針進(jìn)行算術(shù)操作時(shí)給出警告。也很有用。 -Wall 并不會(huì)打開此項(xiàng)。

-Wcast-qual
當(dāng)強(qiáng)制轉(zhuǎn)化丟掉了類型修飾符時(shí)給出警告。 -Wall 并不會(huì)打開此項(xiàng)。

-Waggregate-return
如果定義或調(diào)用了返回結(jié)構(gòu)體或聯(lián)合體的函數(shù),編譯器就發(fā)出警告。

-Winline
無論是聲明為 inline 或者是指定了-finline-functions 選項(xiàng),如果某函數(shù)不能內(nèi)聯(lián),編譯器都將發(fā)出警告。如果你的代碼含有很多 inline 函數(shù)的話,這是很有用的選項(xiàng)。

-Werror
把警告當(dāng)作錯(cuò)誤。出現(xiàn)任何警告就放棄編譯。

-Wunreachable-code
如果編譯器探測到永遠(yuǎn)不會(huì)執(zhí)行到的代碼,就給出警告。也是比較有用的選項(xiàng)。

-Wcast-align
一旦某個(gè)指針類型強(qiáng)制轉(zhuǎn)換導(dǎo)致目標(biāo)所需的地址對(duì)齊增加時(shí),編譯器就發(fā)出警告。

-Wundef
當(dāng)一個(gè)沒有定義的符號(hào)出現(xiàn)在 #if 中時(shí),給出警告。

-Wredundant-decls
如果在同一個(gè)可見域內(nèi)某定義多次聲明,編譯器就發(fā)出警告,即使這些重復(fù)聲明有效并且毫無差別。

Optimization

-O0
禁止編譯器進(jìn)行優(yōu)化。默認(rèn)為此項(xiàng)。

-O
-O1
嘗試優(yōu)化編譯時(shí)間和可執(zhí)行文件大小。

-O2
更多的優(yōu)化,會(huì)嘗試幾乎全部的優(yōu)化功能,但不會(huì)進(jìn)行“空間換時(shí)間”的優(yōu)化方法。

-O3
在 -O2 的基礎(chǔ)上再打開一些優(yōu)化選項(xiàng):-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。

-Os
對(duì)生成文件大小進(jìn)行優(yōu)化。它會(huì)打開 -O2 開的全部選項(xiàng),除了會(huì)那些增加文件大小的。

-finline-functions
把所有簡單的函數(shù)內(nèi)聯(lián)進(jìn)調(diào)用者。編譯器會(huì)探索式地決定哪些函數(shù)足夠簡單,值得做這種內(nèi)聯(lián)。

-fstrict-aliasing
施加最強(qiáng)的別名規(guī)則(aliasing rules)。

Standard

-ansi
支持符合ANSI標(biāo)準(zhǔn)的C程序。這樣就會(huì)關(guān)閉GNU C中某些不兼容ANSI C的特性。

-std=c89
-iso9899:1990
指明使用標(biāo)準(zhǔn) ISO C90 作為標(biāo)準(zhǔn)來編譯程序。

-std=c99
-std=iso9899:1999
指明使用標(biāo)準(zhǔn) ISO C99 作為標(biāo)準(zhǔn)來編譯程序。

-std=c++98
指明使用標(biāo)準(zhǔn) C++98 作為標(biāo)準(zhǔn)來編譯程序。

-std=gnu9x
-std=gnu99
使用 ISO C99 再加上 GNU 的一些擴(kuò)展。

-fno-asm
不把a(bǔ)sm, inline或typeof當(dāng)作關(guān)鍵字,因此這些詞可以用做標(biāo)識(shí)符。用 __asm__, __inline__和__typeof__能夠替代它們。 `-ansi' 隱含聲明了`-fno-asm'。

-fgnu89-inline
告訴編譯器在 C99 模式下看到 inline 函數(shù)時(shí)使用傳統(tǒng)的 GNU 句法。

C options

-fsigned-char
-funsigned-char
把char定義為有/無符號(hào)類型,如同signed char/unsigned char。

-traditional
嘗試支持傳統(tǒng)C編譯器的某些方面。詳見GNU C手冊(cè)。

-fno-builtin
-fno-builtin-function
不接受沒有 __builtin_ 前綴的函數(shù)作為內(nèi)建函數(shù)。

-trigraphs
支持ANSI C的三聯(lián)符( trigraphs)。`-ansi'選項(xiàng)隱含聲明了此選項(xiàng)。

-fsigned-bitfields
-funsigned-bitfields
如果沒有明確聲明`signed'或`unsigned'修飾符,這些選項(xiàng)用來定義有符號(hào)位域或無符號(hào)位域。缺省情況下,位域是有符號(hào)的,因?yàn)樗鼈兝^承的基本整數(shù)類型,如int,是有符號(hào)數(shù)。

-Wstrict-prototypes
如果函數(shù)的聲明或定義沒有指出參數(shù)類型,編譯器就發(fā)出警告。很有用的警告。

-Wmissing-prototypes
如果沒有預(yù)先聲明就定義了全局函數(shù),編譯器就發(fā)出警告。即使函數(shù)定義自身提供了函數(shù)原形也會(huì)產(chǎn)生這個(gè)警告。這個(gè)選項(xiàng) 的目的是檢查沒有在頭文件中聲明的全局函數(shù)。

-Wnested-externs
如果某extern聲明出現(xiàn)在函數(shù)內(nèi)部,編譯器就發(fā)出警告。

C++ options

-ffor-scope
從頭開始執(zhí)行程序,也允許進(jìn)行重定向。

-fno-rtti
關(guān)閉對(duì) dynamic_cast 和 typeid 的支持。如果你不需要這些功能,關(guān)閉它會(huì)節(jié)省一些空間。

-Wctor-dtor-privacy
當(dāng)一個(gè)類沒有用時(shí)給出警告。因?yàn)闃?gòu)造函數(shù)和析構(gòu)函數(shù)會(huì)被當(dāng)作私有的。

-Wnon-virtual-dtor
當(dāng)一個(gè)類有多態(tài)性,而又沒有虛析構(gòu)函數(shù)時(shí),發(fā)出警告。-Wall會(huì)開啟這個(gè)選項(xiàng)。

-Wreorder
如果代碼中的成員變量的初始化順序和它們實(shí)際執(zhí)行時(shí)初始化順序不一致,給出警告。

-Wno-deprecated
使用過時(shí)的特性時(shí)不要給出警告。

-Woverloaded-virtual
如果函數(shù)的聲明隱藏住了基類的虛函數(shù),就給出警告。

Machine Dependent Options (Intel)

-mtune=cpu-type
為指定類型的 CPU 生成代碼。cpu-type 可以是:i386,i486,i586,pentium,i686,pentium4 等等。

-msse
-msse2
-mmmx
-mno-sse
-mno-sse2
-mno-mmx
使用或者不使用MMX,SSE,SSE2指令。

-m32
-m64
生成32位/64位機(jī)器上的代碼。

-mpush-args
-mno-push-args
(不)使用 push 指令來進(jìn)行存儲(chǔ)參數(shù)。默認(rèn)是使用。

-mregparm=num
當(dāng)傳遞整數(shù)參數(shù)時(shí),控制所使用寄存器的個(gè)數(shù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多