gcc使用手冊(2)(轉)
gcc使用手冊(2)(轉)[@more@]聯結器選項(LINKER OPTION)
下面的選項用於編譯器連線目標檔案,輸出可執行檔案的時候.如果編譯器不進行 連
接,他們就毫無意義.
object-file-name
如果某些檔案沒有特別明確的字尾a special recognized suffix, GCC就認為他們
是目標檔案或庫檔案. (根據檔案內容,聯結器能夠區分目標檔案和庫檔案).如果GC
C執行連線操作,這些目標檔案將成為聯結器的輸入檔案.
-llibrary
連線名為library的庫檔案.
聯結器在標準搜尋目錄中尋找這個庫檔案,庫檔案的真正名字是`liblibrary.a'.連
接器會 當做檔名得到準確說明一樣引用這個檔案.
搜尋目錄除了一些系統標準目錄外,還包括使用者以`-L'選項指定的路徑.
一般說來用這個方法找到的檔案是庫檔案---即由目標檔案組成的歸檔檔案(archiv
e file).聯結器處理歸檔檔案的 方法是:掃描歸檔檔案,尋找某些成員,這些成員的
符號目前已被引用,不過還沒有被定義.但是,如果聯結器找到普通的 目標檔案,而不
是庫檔案,就把這個目標檔案按平常方式連線進來.指定`-l'選項和指定檔名的唯
一區別是, `-l選項用`lib'和`.a'把library包裹起來,而且搜尋一些目錄.
-lobjc
這個-l選項的特殊形式用於連線Objective C程式.
-nostartfiles
不連線系統標準啟動檔案,而標準庫檔案仍然正常使用.
-nostdlib
不連線系統標準啟動檔案和標準庫檔案.只把指定的檔案傳遞給聯結器.
-static
在支援動態連線(dynamic linking)的系統上,阻止連線共享庫.該選項在其他系統上
無效.
-shared
生成一個共享目標檔案,他可以和其他目標檔案連線產生可執行檔案.只有部分系統
支援該選項.
-symbolic
建立共享目標檔案的時候,把引用繫結到全域性符號上.對所有無法解析的引用作出警
告(除非用連線編輯選項 `-Xlinker -z -Xlinker defs'取代).只有部分系統支援該
選項.
-Xlinker option
把選項option傳遞給聯結器.可以用他傳遞系統特定的連線選項, GNU CC無法識別這
些選項.
如果需要傳遞攜帶引數的選項,你必須使用兩次`-Xlinker',一次傳遞選項,另一次傳
遞他的引數. 例如,如果傳遞`-assert definitions',你必須寫成`-Xlinker -asse
rt -Xlinker definitions',而不能寫成`-Xlinker "-assert definitions"',因為
這樣會把整個 字串當做一個引數傳遞,顯然這不是聯結器期待的.
-Wl,option
把選項option傳遞給聯結器.如果option中含有逗號,就在逗號處分割成多個選項.
-u symbol
使聯結器認為取消了symbol的符號定義,從而連線庫模組以取得定義.你可以使用多
個 `-u'選項,各自跟上不同的符號,使得聯結器調入附加的庫模組.
目錄選項(DIRECTORY OPTION)
下列選項指定搜尋路徑,用於查詢標頭檔案,庫檔案,或編譯器的某些成員:
-Idir
在標頭檔案的搜尋路徑列表中新增dir 目錄.
-I-
任何在`-I-'前面用`-I'選項指定的搜尋路徑只適用於`#include "file"'這種情況
;他們不能用來搜尋`#include'包含的標頭檔案.
如果用`-I'選項指定的搜尋路徑位於`-I-'選項後面,就可以在這些路徑中搜尋所有
的 `#include'指令. (一般說來-I選項就是這麼用的.)
還有, `-I-'選項能夠阻止當前目錄(存放當前輸入檔案的地方)成為搜尋`#include
"file"'的第一選擇.沒有辦法克服`-I-'選項的這個效應.你可以指定 `-I.'搜尋那
個目錄,它在呼叫編譯器時是當前目錄.這和前處理器的預設行為不完全一樣,但是結
果通常 令人滿意.
`-I-'不影響使用系統標準目錄,因此, `-I-'和`-nostdinc'是不同的選項.
-Ldir
在`-l'選項的搜尋路徑列表中新增dir目錄.
-Bprefix
這個選項指出在何處尋找可執行檔案,庫檔案,以及編譯器自己的資料檔案.
編譯器驅動程式需要執行某些下面的子程式: `cpp', `cc1' (或C++的 `cc1plus')
, `as'和`ld'.他把prefix當作欲執行的程式的 字首,既可以包括也可以不包括`ma
chine/version/'.
對於要執行的子程式,編譯器驅動程式首先試著加上`-B'字首(如果存在).如果沒有
找到檔案,或沒有指定 `-B'選項,編譯器接著會試驗兩個標準字首`/usr/lib/gcc/'
和 `/usr/local/lib/gcc-lib/'.如果仍然沒能夠找到所需檔案,編譯器就在`PATH'
環境變數 指定的路徑中尋找沒加任何字首的檔名.
如果有需要,執行時(run-time)支援檔案`libgcc.a'也在`-B'字首的搜尋範圍之內.
如果這裡沒有找到,就在上面提到的兩個標準字首中尋找,僅此而已.如果上述方法
沒有找到這個檔案,就不連線他了.多數 情況的多數機器上, `libgcc.a'並非必不可
少.
你可以透過環境變數GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變數,其值就
和上面說的 一樣用做字首.如果同時指定了`-B'選項和GCC_EXEC_PREFIX變數,編譯
器首先使用 `-B'選項,然後才嘗試環境變數值.
警告選項(WARNING OPTION)
警告是針對程式結構的診斷資訊,程式不一定有錯誤,而是存在風險,或者可能存在
錯誤.
下列選項控制GNU CC產生的警告的數量和型別:
-fsyntax-only
檢查程式中的語法錯誤,但是不產生輸出資訊.
-w
禁止所有警告資訊.
-Wno-import
禁止所有關於#import的警告資訊.
-pedantic
開啟完全服從ANSI C標準所需的全部警告診斷;拒絕接受採用了被禁止的語法擴充套件的
程式.
無論有沒有這個選項,符合ANSI C標準的程式應該能夠被正確編譯(雖然極少數程式
需要`-ansi' 選項).然而,如果沒有這個選項,某些GNU擴充套件和傳統C特性也得到支援
使用這個選項可以拒絕這些程式.沒有理由 使用這個選項,他存在只是為了滿足一
些書呆子(pedant).
對於替選關鍵字(他們以`__'開始和結束) `-pedantic'不會產生警告資訊. Pedant
ic 也不警告跟在__extension__後面的表示式.不過只應該在系統標頭檔案中使用這種
轉義措施,應用程式最好 避免.
-pedantic-errors
該選項和`-pedantic'類似,但是顯示錯誤而不是警告.
-W
對下列事件顯示額外的警告資訊:
*
非易變自動變數(nonvolatile automatic variable)可能在呼叫longjmp時發生改變
這些警告僅在最佳化編譯時發生.
編譯器只知道對setjmp的呼叫,他不可能知道會在哪裡呼叫longjmp,事實上一個 信
號處理例程可以在程式的任何地點呼叫他.其結果是,即使程式沒有問題,你也可能會
得到警告,因為無法在可能出現問題 的地方呼叫longjmp.
*
既可以返回值,也可以不返回值的函式. (缺少結尾的函式體被看作不返回函式值)例
如,下面的函式將導致這種警告:
foo (a)
{
if (a > 0)
return a;
}
由於GNU CC不知道某些函式永不返回(含有abort和longjmp),因此有可能出現 虛假
警告.
*
表示式語句或逗號表示式的左側沒有產生作用(side effect).如果要防止這種警告
,應該把未使用的表示式強制轉換 為void型別.例如,這樣的表示式`x[i,j]'會導致
警告,而`x[(void)i,j]'就不會.
*
無符號數用`>'或`<='和零做比較.
-Wimplicit-int
警告沒有指定型別的宣告.
-Wimplicit-function-declaration
警告在宣告之前就使用的函式.
-Wimplicit
同-Wimplicit-int和-Wimplicit-function-declaration.
-Wmain
如果把main函式宣告或定義成奇怪的型別,編譯器就發出警告.典型情況下,這個函式
用於外部連線, 返回int數值,不需要引數,或指定兩個引數.
-Wreturn-type
如果函式定義了返回型別,而預設型別是int型,編譯器就發出警告.同時警告那些不
帶返回值的 return語句,如果他們所屬的函式並非void型別.
-Wunused
如果某個區域性變數除了宣告就沒再使用,或者宣告瞭靜態函式但是沒有定義,或者某
條語句的運算結果顯然沒有使用, 編譯器就發出警告.
-Wswitch
如果某條switch語句的引數屬於列舉型別,但是沒有對應的case語句使用列舉元素,
編譯器 就發出警告. ( default語句的出現能夠防止這個警告.)超出列舉範圍的ca
se語句同樣會 導致這個警告.
-Wcomment
如果註釋起始序列`/*'出現在註釋中,編譯器就發出警告.
-Wtrigraphs
警告任何出現的trigraph (假設允許使用他們).
-Wformat
檢查對printf和scanf等函式的呼叫,確認各個引數型別和格式串中的一致.
-Wchar-subscripts
警告型別是char的陣列下標.這是常見錯誤,程式設計師經常忘記在某些機器上char有符
號.
-Wuninitialized
在初始化之前就使用自動變數.
這些警告只可能做最佳化編譯時出現,因為他們需要資料流資訊,只有做最佳化的時候才
估算資料流資訊.如果不指定 `-O'選項,就不會出現這些警告.
這些警告僅針對等候分配暫存器的變數.因此不會發生在宣告為volatile的變數上面
,不會發生在已經 取得地址的變數,或長度不等於1, 2, 4, 8位元組的變數.同樣也不
會發生在結構,聯合或陣列上面,即使他們在 暫存器中.
注意,如果某個變數只計算了一個從未使用過的值,這裡可能不會警告.因為在顯示警
告之前,這樣的計算已經被 資料流分析刪除了.
這些警告作為可選項是因為GNU CC還沒有智慧到判別所有的情況,知道有些看上去錯
誤的程式碼其實是正確的.下面是 一個這樣的例子:
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
如果y始終是1, 2或3,那麼x總會被初始化,但是GNU CC不知道這一點.下面是 另一個
普遍案例:
{
int save_y;
if (change_y) save_y = y, y = new_y;
...
if (change_y) y = save_y;
}
這裡沒有錯誤,因為只有設定了save_y才使用他.
把所有不返回的函式定義為volatile可以避免某些似是而非的警告.
-Wparentheses
在某些情況下如果忽略了括號,編譯器就發出警告.
-Wtemplate-debugging
當在C++程式中使用template的時候,如果除錯(debugging)沒有完全生效,編譯器就
發出警告. (僅用於C++).
-Wall
結合所有上述的`-W'選項.通常我們建議避免這些被警告的用法,我們相信,恰當結
合宏的使用能夠 輕易避免這些用法。
剩下的`-W...'選項不包括在`-Wall'中,因為我們認為在必要情況下,這些被編譯器
警告 的程式結構,可以合理的用在"乾淨的"程式中.
-Wtraditional
如果某些程式結構在傳統C中的表現和ANSI C不同,編譯器就發出警告.
*
宏參出現在宏體的字串常量內部.傳統C會替換宏參,而ANSI C則視其為常量的一部
分.
*
某個函式在塊(block)中宣告為外部,但在塊結束後才呼叫.
*
switch語句的運算元型別是long.
-Wshadow
一旦某個區域性變數遮蔽了另一個區域性變數,編譯器就發出警告.
-Wid-clash-len
一旦兩個確定的識別符號具有相同的前len個字元,編譯器就發出警告.他可以協助你開
發一些將要在某些 過時的,危害大腦的編譯器上編譯的程式.
-Wpointer-arith
任何語句如果依賴於函式型別的大小(size)或者void型別的大小,編譯器就發出警告
GNU C為了 便於計算void *指標和函式指標,就把這些型別的大小定義為1.
-Wcast-qual
一旦某個指標強制型別轉換以便移除型別修飾符時,編譯器就發出警告.例如,如果把
const char * 強制轉換為普通的char *時,警告就會出現.
-Wcast-align
一旦某個指標型別強制轉換時,導致目標所需的地址對齊(alignment)增加,編譯器就
發出警告.例如,某些機器上 只能在2或4位元組邊界上訪問整數,如果在這種機型上把
char *強制轉換成int *型別, 編譯器就發出警告.
-Wwrite-strings
規定字串常量的型別是const char[length],因此,把這樣的地址複製給 non-con
st char *指標將產生警告.這些警告能夠幫助你在編譯期間發現企圖寫入字串常
量 的程式碼,但是你必須非常仔細的在宣告和原形中使用const,否則他們只能帶來麻
煩;所以我們沒有讓 `-Wall'提供這些警告.
-Wconversion
如果某函式原形導致的型別轉換和無函式原形時的型別轉換不同,編譯器就發出警告
這裡包括定點數和浮點數的 互相轉換,改變定點數的寬度或符號,除非他們和預設
宣告(default promotion)相同.
-Waggregate-return
如果定義或呼叫了返回結構或聯合的函式,編譯器就發出警告. (從語言角度你可以
返回一個陣列,然而同樣會 導致警告.)
-Wstrict-prototypes
如果函式的宣告或定義沒有指出引數型別,編譯器就發出警告. (如果函式的前向引
用說明指出了引數型別,則允許後面 使用舊式風格的函式定義,而不會產生警告.)
-Wmissing-prototypes
如果沒有預先宣告函式原形就定義了全域性函式,編譯器就發出警告.即使函式定義自
身提供了函式原形也會產生這個警告. 他的目的是檢查沒有在標頭檔案中宣告的全域性
函式.
-Wmissing-declarations
如果沒有預先宣告就定義了全域性函式,編譯器就發出警告.即使函式定義自身提供了
函式原形也會產生這個警告.這個選項 的目的是檢查沒有在標頭檔案中宣告的全域性函
數.
-Wredundant-decls
如果在同一個可見域某定義多次宣告,編譯器就發出警告,即使這些重複宣告有效並
且毫無差別.
-Wnested-externs
如果某extern宣告出現在函式內部,編譯器就發出警告.
-Wenum-clash
對於不同列舉型別之間的轉換髮出警告(僅適用於C++).
-Wlong-long
如果使用了long long 型別就發出警告.該警告是預設項.使用`-Wno-long-long' 選
項能夠防止這個警告. `-Wlong-long'和`-Wno-long-long'僅在 `-pedantic'之下才
起作用.
-Woverloaded-virtual
(僅適用於C++.)在繼承類中,虛擬函式的定義必須匹配虛擬函式在基類中宣告的型別特徵
(type signature).當 繼承類宣告瞭某個函式,它可能是個錯誤的嘗試企圖定義一個
虛擬函式,使用這個選項能夠產生警告:就是說,當某個函式和基類 中的虛擬函式同名,但
是型別特徵不符合基類的任何虛擬函式,編譯器將發出警告.
-Winline
如果某函式不能內嵌(inline),無論是宣告為inline或者是指定了-finline-functi
ons 選項,編譯器都將發出警告.
-Werror
視警告為錯誤;出現任何警告即放棄編譯.
除錯選項(DEBUGGING OPTION)
GNU CC擁有許多特別選項,既可以除錯使用者的程式,也可以對GCC排錯:
-g
以作業系統的本地格式(stabs, COFF, XCOFF,或DWARF).產生除錯資訊. GDB能夠使
用這些除錯資訊.
在大多數使用stabs格式的系統上, `-g'選項啟動只有GDB才使用的額外除錯資訊;這
些資訊使GDB 除錯效果更好,但是有可能導致其他偵錯程式崩潰,或拒絕讀入程式.如果
你確定要控制是否生成額外的資訊, 使用`-gstabs+', `-gstabs', `-gxcoff+', `
-gxcoff', `-gdwarf+',或`-gdwarf' (見下文).
和大多數C編譯器不同, GNU CC允許結合使用`-g'和`-O'選項.最佳化的程式碼偶爾製造
一些驚異的結果:某些宣告過的變數根本不存在;控制流程直接跑到沒有預料到的地
方;某些語句因為計算結果是常量或已經確定而 沒有執行;某些語句在其他地方執行
,因為他們被移到迴圈外面了.
然而它證明了除錯最佳化的輸出是可能的.對可能含有錯誤的程式使用最佳化器是合理的
如果GNU CC支援輸出多種除錯資訊,下面的選項則非常有用.
-ggdb
以本地格式(如果支援)輸出除錯資訊,儘可能包括GDB擴充套件.
-gstabs
以stabs格式(如果支援)輸出除錯資訊,不包括GDB擴充套件.這是大多數BSD系統上DBX使
用的格式.
-gstabs+
以stabs格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使
用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.
-gcoff
以COFF格式(如果支援)輸出除錯資訊.這是在System V第四版以前的大多數System
V系統上SDB使用的 格式.
-gxcoff
以XCOFF格式(如果支援)輸出除錯資訊.這是IBM RS/6000系統上DBX偵錯程式使用的格
式.
-gxcoff+
以XCOFF格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使
用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.
-gdwarf
以DWARF格式(如果支援)輸出除錯資訊.這是大多數System V第四版系統上SDB使用的
格式.
-gdwarf+
以DWARF格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使
用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.
-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel
-gdwarflevel
請求生成除錯資訊,同時用level指出需要多少資訊.預設的level值是2.
Level 1輸出最少量的資訊,僅夠在不打算除錯的程式段內backtrace.包括函式和外
部變數的描述,但是 沒有區域性變數和行號資訊.
Level 3包含更多的資訊,如程式中出現的所有宏定義.當使用`-g3'選項的時候,某些
偵錯程式支援 宏擴充套件.
-p
產生額外程式碼,用於輸出profile資訊,供分析程式prof使用.
-pg
產生額外程式碼,用於輸出profile資訊,供分析程式gprof使用.
-a
產生額外程式碼,用於輸出基本塊(basic block)的profile資訊,它記錄各個基本塊的
執行次數,供諸如 tcov此類的程式分析.但是注意,這個資料格式並非tcov期待的.最
終GNU gprof 將處理這些資料.
-ax
產生額外程式碼,用於從'bb.in'檔案讀取基本塊的profile引數,把profile的結果寫到
'bb.out' 檔案. `bb.in'包含一張函式列表.一旦進入列表中的某個函式, profile
操作就開始,離開最外層的函式後, profile操作就結束.以`-'為字首名的函式排除
在profile操作之外.如果函式名不是唯一的,它可以寫成 `/path/filename.d:func
tionname'來澄清. `bb.out'將列出一些有效的檔名.這四個函式名具有 特殊含義
: `__bb_jumps__'導致跳轉(jump)頻率寫進`bb.out'. `__bb_trace__'導致基本塊
序列透過 管道傳到`gzip',輸出`bbtrace.gz'檔案. `__bb_hidecall__'導致從跟蹤
(trace)中排除call 指令. `__bb_showret__'導致在跟蹤中包括返回指令.
-dletters
編譯的時候,在letters指定的時刻做除錯轉儲(dump).用於除錯編譯器.大多數轉儲
的檔名 透過原始檔名新增字詞獲得(例如`foo.c.rtl'或`foo.c.jump').
-dM
預處理結束的時候轉儲所有的宏定義,不輸出到檔案.
-dN
預處理結束的時候轉儲所有的宏名.
-dD
預處理結束的時候轉儲所有的宏定義,同時進行正常輸出.
-dy
語法分析(parse)的時候在標準錯誤轉儲除錯資訊.
-dr
RTL階段後轉儲到`file.rtl'.
-dx
僅對函式生成RTL,而不是編譯.通常和`r'聯用.
-dj
第一次跳轉最佳化後轉儲到`file.jump'.
-ds
CSE (包括有時候跟在CSE後面的跳轉最佳化)後轉儲到`file.cse'.
-dL
迴圈最佳化後轉儲到`file.loop'.
-dt
第二次CSE處理(包括有時候跟在CSE後面的跳轉最佳化)後轉儲到`file.cse2'.
-df
流程分析(flow analysis)後轉儲到`file.flow'.
-dc
指令組合(instruction combination)後轉儲到`file.combine'.
-dS
第一次指令安排(instruction schedule)後轉儲到`file.sched'.
-dl
區域性暫存器分配後轉儲到`file.lreg'.
-dg
全域性暫存器分配後轉儲到`file.greg'.
-dR
第二次指令安排(instruction schedule)後轉儲到`file.sched2'.
-dJ
最後一次跳轉最佳化後轉儲到`file.jump2'.
-dd
推遲分支排程(delayed branch scheduling)後轉儲到`file.dbr'.
-dk
暫存器-堆疊轉換後轉儲到`file.stack'.
-da
產生以上所有的轉儲.
-dm
執行結束後,在標準錯誤顯示記憶體使用統計.
-dp
在彙編輸出加註指明使用了哪些模式(pattern)及其替代模式.
-fpretend-float
交叉編譯的時候,假定目標機和宿主機使用同樣的浮點格式.它導致輸出錯誤的浮點
常數,但是在目標機上執行的時候, 真實的指令序列有可能和GNU CC希望的一樣.
-save-temps
儲存那些通常是``臨時''的中間檔案;置於當前目錄下,並且根據原始檔命名.因此,
用`-c -save-temps'選項編譯`foo.c '會生成` foo.cpp'和`foo.s' 以及`foo.o'文
件.
-print-file-name=library
顯示庫檔案library的全路徑名,連線時會使用這個庫---其他什麼事情都不作.根據
這個選項, GNU CC既不編譯,也不連線,僅僅顯示檔名.
下面的選項用於編譯器連線目標檔案,輸出可執行檔案的時候.如果編譯器不進行 連
接,他們就毫無意義.
object-file-name
如果某些檔案沒有特別明確的字尾a special recognized suffix, GCC就認為他們
是目標檔案或庫檔案. (根據檔案內容,聯結器能夠區分目標檔案和庫檔案).如果GC
C執行連線操作,這些目標檔案將成為聯結器的輸入檔案.
-llibrary
連線名為library的庫檔案.
聯結器在標準搜尋目錄中尋找這個庫檔案,庫檔案的真正名字是`liblibrary.a'.連
接器會 當做檔名得到準確說明一樣引用這個檔案.
搜尋目錄除了一些系統標準目錄外,還包括使用者以`-L'選項指定的路徑.
一般說來用這個方法找到的檔案是庫檔案---即由目標檔案組成的歸檔檔案(archiv
e file).聯結器處理歸檔檔案的 方法是:掃描歸檔檔案,尋找某些成員,這些成員的
符號目前已被引用,不過還沒有被定義.但是,如果聯結器找到普通的 目標檔案,而不
是庫檔案,就把這個目標檔案按平常方式連線進來.指定`-l'選項和指定檔名的唯
一區別是, `-l選項用`lib'和`.a'把library包裹起來,而且搜尋一些目錄.
-lobjc
這個-l選項的特殊形式用於連線Objective C程式.
-nostartfiles
不連線系統標準啟動檔案,而標準庫檔案仍然正常使用.
-nostdlib
不連線系統標準啟動檔案和標準庫檔案.只把指定的檔案傳遞給聯結器.
-static
在支援動態連線(dynamic linking)的系統上,阻止連線共享庫.該選項在其他系統上
無效.
-shared
生成一個共享目標檔案,他可以和其他目標檔案連線產生可執行檔案.只有部分系統
支援該選項.
-symbolic
建立共享目標檔案的時候,把引用繫結到全域性符號上.對所有無法解析的引用作出警
告(除非用連線編輯選項 `-Xlinker -z -Xlinker defs'取代).只有部分系統支援該
選項.
-Xlinker option
把選項option傳遞給聯結器.可以用他傳遞系統特定的連線選項, GNU CC無法識別這
些選項.
如果需要傳遞攜帶引數的選項,你必須使用兩次`-Xlinker',一次傳遞選項,另一次傳
遞他的引數. 例如,如果傳遞`-assert definitions',你必須寫成`-Xlinker -asse
rt -Xlinker definitions',而不能寫成`-Xlinker "-assert definitions"',因為
這樣會把整個 字串當做一個引數傳遞,顯然這不是聯結器期待的.
-Wl,option
把選項option傳遞給聯結器.如果option中含有逗號,就在逗號處分割成多個選項.
-u symbol
使聯結器認為取消了symbol的符號定義,從而連線庫模組以取得定義.你可以使用多
個 `-u'選項,各自跟上不同的符號,使得聯結器調入附加的庫模組.
目錄選項(DIRECTORY OPTION)
下列選項指定搜尋路徑,用於查詢標頭檔案,庫檔案,或編譯器的某些成員:
-Idir
在標頭檔案的搜尋路徑列表中新增dir 目錄.
-I-
任何在`-I-'前面用`-I'選項指定的搜尋路徑只適用於`#include "file"'這種情況
;他們不能用來搜尋`#include
如果用`-I'選項指定的搜尋路徑位於`-I-'選項後面,就可以在這些路徑中搜尋所有
的 `#include'指令. (一般說來-I選項就是這麼用的.)
還有, `-I-'選項能夠阻止當前目錄(存放當前輸入檔案的地方)成為搜尋`#include
"file"'的第一選擇.沒有辦法克服`-I-'選項的這個效應.你可以指定 `-I.'搜尋那
個目錄,它在呼叫編譯器時是當前目錄.這和前處理器的預設行為不完全一樣,但是結
果通常 令人滿意.
`-I-'不影響使用系統標準目錄,因此, `-I-'和`-nostdinc'是不同的選項.
-Ldir
在`-l'選項的搜尋路徑列表中新增dir目錄.
-Bprefix
這個選項指出在何處尋找可執行檔案,庫檔案,以及編譯器自己的資料檔案.
編譯器驅動程式需要執行某些下面的子程式: `cpp', `cc1' (或C++的 `cc1plus')
, `as'和`ld'.他把prefix當作欲執行的程式的 字首,既可以包括也可以不包括`ma
chine/version/'.
對於要執行的子程式,編譯器驅動程式首先試著加上`-B'字首(如果存在).如果沒有
找到檔案,或沒有指定 `-B'選項,編譯器接著會試驗兩個標準字首`/usr/lib/gcc/'
和 `/usr/local/lib/gcc-lib/'.如果仍然沒能夠找到所需檔案,編譯器就在`PATH'
環境變數 指定的路徑中尋找沒加任何字首的檔名.
如果有需要,執行時(run-time)支援檔案`libgcc.a'也在`-B'字首的搜尋範圍之內.
如果這裡沒有找到,就在上面提到的兩個標準字首中尋找,僅此而已.如果上述方法
沒有找到這個檔案,就不連線他了.多數 情況的多數機器上, `libgcc.a'並非必不可
少.
你可以透過環境變數GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變數,其值就
和上面說的 一樣用做字首.如果同時指定了`-B'選項和GCC_EXEC_PREFIX變數,編譯
器首先使用 `-B'選項,然後才嘗試環境變數值.
警告選項(WARNING OPTION)
警告是針對程式結構的診斷資訊,程式不一定有錯誤,而是存在風險,或者可能存在
錯誤.
下列選項控制GNU CC產生的警告的數量和型別:
-fsyntax-only
檢查程式中的語法錯誤,但是不產生輸出資訊.
-w
禁止所有警告資訊.
-Wno-import
禁止所有關於#import的警告資訊.
-pedantic
開啟完全服從ANSI C標準所需的全部警告診斷;拒絕接受採用了被禁止的語法擴充套件的
程式.
無論有沒有這個選項,符合ANSI C標準的程式應該能夠被正確編譯(雖然極少數程式
需要`-ansi' 選項).然而,如果沒有這個選項,某些GNU擴充套件和傳統C特性也得到支援
使用這個選項可以拒絕這些程式.沒有理由 使用這個選項,他存在只是為了滿足一
些書呆子(pedant).
對於替選關鍵字(他們以`__'開始和結束) `-pedantic'不會產生警告資訊. Pedant
ic 也不警告跟在__extension__後面的表示式.不過只應該在系統標頭檔案中使用這種
轉義措施,應用程式最好 避免.
-pedantic-errors
該選項和`-pedantic'類似,但是顯示錯誤而不是警告.
-W
對下列事件顯示額外的警告資訊:
*
非易變自動變數(nonvolatile automatic variable)可能在呼叫longjmp時發生改變
這些警告僅在最佳化編譯時發生.
編譯器只知道對setjmp的呼叫,他不可能知道會在哪裡呼叫longjmp,事實上一個 信
號處理例程可以在程式的任何地點呼叫他.其結果是,即使程式沒有問題,你也可能會
得到警告,因為無法在可能出現問題 的地方呼叫longjmp.
*
既可以返回值,也可以不返回值的函式. (缺少結尾的函式體被看作不返回函式值)例
如,下面的函式將導致這種警告:
foo (a)
{
if (a > 0)
return a;
}
由於GNU CC不知道某些函式永不返回(含有abort和longjmp),因此有可能出現 虛假
警告.
*
表示式語句或逗號表示式的左側沒有產生作用(side effect).如果要防止這種警告
,應該把未使用的表示式強制轉換 為void型別.例如,這樣的表示式`x[i,j]'會導致
警告,而`x[(void)i,j]'就不會.
*
無符號數用`>'或`<='和零做比較.
-Wimplicit-int
警告沒有指定型別的宣告.
-Wimplicit-function-declaration
警告在宣告之前就使用的函式.
-Wimplicit
同-Wimplicit-int和-Wimplicit-function-declaration.
-Wmain
如果把main函式宣告或定義成奇怪的型別,編譯器就發出警告.典型情況下,這個函式
用於外部連線, 返回int數值,不需要引數,或指定兩個引數.
-Wreturn-type
如果函式定義了返回型別,而預設型別是int型,編譯器就發出警告.同時警告那些不
帶返回值的 return語句,如果他們所屬的函式並非void型別.
-Wunused
如果某個區域性變數除了宣告就沒再使用,或者宣告瞭靜態函式但是沒有定義,或者某
條語句的運算結果顯然沒有使用, 編譯器就發出警告.
-Wswitch
如果某條switch語句的引數屬於列舉型別,但是沒有對應的case語句使用列舉元素,
編譯器 就發出警告. ( default語句的出現能夠防止這個警告.)超出列舉範圍的ca
se語句同樣會 導致這個警告.
-Wcomment
如果註釋起始序列`/*'出現在註釋中,編譯器就發出警告.
-Wtrigraphs
警告任何出現的trigraph (假設允許使用他們).
-Wformat
檢查對printf和scanf等函式的呼叫,確認各個引數型別和格式串中的一致.
-Wchar-subscripts
警告型別是char的陣列下標.這是常見錯誤,程式設計師經常忘記在某些機器上char有符
號.
-Wuninitialized
在初始化之前就使用自動變數.
這些警告只可能做最佳化編譯時出現,因為他們需要資料流資訊,只有做最佳化的時候才
估算資料流資訊.如果不指定 `-O'選項,就不會出現這些警告.
這些警告僅針對等候分配暫存器的變數.因此不會發生在宣告為volatile的變數上面
,不會發生在已經 取得地址的變數,或長度不等於1, 2, 4, 8位元組的變數.同樣也不
會發生在結構,聯合或陣列上面,即使他們在 暫存器中.
注意,如果某個變數只計算了一個從未使用過的值,這裡可能不會警告.因為在顯示警
告之前,這樣的計算已經被 資料流分析刪除了.
這些警告作為可選項是因為GNU CC還沒有智慧到判別所有的情況,知道有些看上去錯
誤的程式碼其實是正確的.下面是 一個這樣的例子:
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
如果y始終是1, 2或3,那麼x總會被初始化,但是GNU CC不知道這一點.下面是 另一個
普遍案例:
{
int save_y;
if (change_y) save_y = y, y = new_y;
...
if (change_y) y = save_y;
}
這裡沒有錯誤,因為只有設定了save_y才使用他.
把所有不返回的函式定義為volatile可以避免某些似是而非的警告.
-Wparentheses
在某些情況下如果忽略了括號,編譯器就發出警告.
-Wtemplate-debugging
當在C++程式中使用template的時候,如果除錯(debugging)沒有完全生效,編譯器就
發出警告. (僅用於C++).
-Wall
結合所有上述的`-W'選項.通常我們建議避免這些被警告的用法,我們相信,恰當結
合宏的使用能夠 輕易避免這些用法。
剩下的`-W...'選項不包括在`-Wall'中,因為我們認為在必要情況下,這些被編譯器
警告 的程式結構,可以合理的用在"乾淨的"程式中.
-Wtraditional
如果某些程式結構在傳統C中的表現和ANSI C不同,編譯器就發出警告.
*
宏參出現在宏體的字串常量內部.傳統C會替換宏參,而ANSI C則視其為常量的一部
分.
*
某個函式在塊(block)中宣告為外部,但在塊結束後才呼叫.
*
switch語句的運算元型別是long.
-Wshadow
一旦某個區域性變數遮蔽了另一個區域性變數,編譯器就發出警告.
-Wid-clash-len
一旦兩個確定的識別符號具有相同的前len個字元,編譯器就發出警告.他可以協助你開
發一些將要在某些 過時的,危害大腦的編譯器上編譯的程式.
-Wpointer-arith
任何語句如果依賴於函式型別的大小(size)或者void型別的大小,編譯器就發出警告
GNU C為了 便於計算void *指標和函式指標,就把這些型別的大小定義為1.
-Wcast-qual
一旦某個指標強制型別轉換以便移除型別修飾符時,編譯器就發出警告.例如,如果把
const char * 強制轉換為普通的char *時,警告就會出現.
-Wcast-align
一旦某個指標型別強制轉換時,導致目標所需的地址對齊(alignment)增加,編譯器就
發出警告.例如,某些機器上 只能在2或4位元組邊界上訪問整數,如果在這種機型上把
char *強制轉換成int *型別, 編譯器就發出警告.
-Wwrite-strings
規定字串常量的型別是const char[length],因此,把這樣的地址複製給 non-con
st char *指標將產生警告.這些警告能夠幫助你在編譯期間發現企圖寫入字串常
量 的程式碼,但是你必須非常仔細的在宣告和原形中使用const,否則他們只能帶來麻
煩;所以我們沒有讓 `-Wall'提供這些警告.
-Wconversion
如果某函式原形導致的型別轉換和無函式原形時的型別轉換不同,編譯器就發出警告
這裡包括定點數和浮點數的 互相轉換,改變定點數的寬度或符號,除非他們和預設
宣告(default promotion)相同.
-Waggregate-return
如果定義或呼叫了返回結構或聯合的函式,編譯器就發出警告. (從語言角度你可以
返回一個陣列,然而同樣會 導致警告.)
-Wstrict-prototypes
如果函式的宣告或定義沒有指出引數型別,編譯器就發出警告. (如果函式的前向引
用說明指出了引數型別,則允許後面 使用舊式風格的函式定義,而不會產生警告.)
-Wmissing-prototypes
如果沒有預先宣告函式原形就定義了全域性函式,編譯器就發出警告.即使函式定義自
身提供了函式原形也會產生這個警告. 他的目的是檢查沒有在標頭檔案中宣告的全域性
函式.
-Wmissing-declarations
如果沒有預先宣告就定義了全域性函式,編譯器就發出警告.即使函式定義自身提供了
函式原形也會產生這個警告.這個選項 的目的是檢查沒有在標頭檔案中宣告的全域性函
數.
-Wredundant-decls
如果在同一個可見域某定義多次宣告,編譯器就發出警告,即使這些重複宣告有效並
且毫無差別.
-Wnested-externs
如果某extern宣告出現在函式內部,編譯器就發出警告.
-Wenum-clash
對於不同列舉型別之間的轉換髮出警告(僅適用於C++).
-Wlong-long
如果使用了long long 型別就發出警告.該警告是預設項.使用`-Wno-long-long' 選
項能夠防止這個警告. `-Wlong-long'和`-Wno-long-long'僅在 `-pedantic'之下才
起作用.
-Woverloaded-virtual
(僅適用於C++.)在繼承類中,虛擬函式的定義必須匹配虛擬函式在基類中宣告的型別特徵
(type signature).當 繼承類宣告瞭某個函式,它可能是個錯誤的嘗試企圖定義一個
虛擬函式,使用這個選項能夠產生警告:就是說,當某個函式和基類 中的虛擬函式同名,但
是型別特徵不符合基類的任何虛擬函式,編譯器將發出警告.
-Winline
如果某函式不能內嵌(inline),無論是宣告為inline或者是指定了-finline-functi
ons 選項,編譯器都將發出警告.
-Werror
視警告為錯誤;出現任何警告即放棄編譯.
除錯選項(DEBUGGING OPTION)
GNU CC擁有許多特別選項,既可以除錯使用者的程式,也可以對GCC排錯:
-g
以作業系統的本地格式(stabs, COFF, XCOFF,或DWARF).產生除錯資訊. GDB能夠使
用這些除錯資訊.
在大多數使用stabs格式的系統上, `-g'選項啟動只有GDB才使用的額外除錯資訊;這
些資訊使GDB 除錯效果更好,但是有可能導致其他偵錯程式崩潰,或拒絕讀入程式.如果
你確定要控制是否生成額外的資訊, 使用`-gstabs+', `-gstabs', `-gxcoff+', `
-gxcoff', `-gdwarf+',或`-gdwarf' (見下文).
和大多數C編譯器不同, GNU CC允許結合使用`-g'和`-O'選項.最佳化的程式碼偶爾製造
一些驚異的結果:某些宣告過的變數根本不存在;控制流程直接跑到沒有預料到的地
方;某些語句因為計算結果是常量或已經確定而 沒有執行;某些語句在其他地方執行
,因為他們被移到迴圈外面了.
然而它證明了除錯最佳化的輸出是可能的.對可能含有錯誤的程式使用最佳化器是合理的
如果GNU CC支援輸出多種除錯資訊,下面的選項則非常有用.
-ggdb
以本地格式(如果支援)輸出除錯資訊,儘可能包括GDB擴充套件.
-gstabs
以stabs格式(如果支援)輸出除錯資訊,不包括GDB擴充套件.這是大多數BSD系統上DBX使
用的格式.
-gstabs+
以stabs格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使
用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.
-gcoff
以COFF格式(如果支援)輸出除錯資訊.這是在System V第四版以前的大多數System
V系統上SDB使用的 格式.
-gxcoff
以XCOFF格式(如果支援)輸出除錯資訊.這是IBM RS/6000系統上DBX偵錯程式使用的格
式.
-gxcoff+
以XCOFF格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使
用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.
-gdwarf
以DWARF格式(如果支援)輸出除錯資訊.這是大多數System V第四版系統上SDB使用的
格式.
-gdwarf+
以DWARF格式(如果支援)輸出除錯資訊,使用只有GNU偵錯程式(GDB)理解的GNU擴充套件.使
用這些擴充套件有可能導致 其他偵錯程式崩潰或拒絕讀入程式.
-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel
-gdwarflevel
請求生成除錯資訊,同時用level指出需要多少資訊.預設的level值是2.
Level 1輸出最少量的資訊,僅夠在不打算除錯的程式段內backtrace.包括函式和外
部變數的描述,但是 沒有區域性變數和行號資訊.
Level 3包含更多的資訊,如程式中出現的所有宏定義.當使用`-g3'選項的時候,某些
偵錯程式支援 宏擴充套件.
-p
產生額外程式碼,用於輸出profile資訊,供分析程式prof使用.
-pg
產生額外程式碼,用於輸出profile資訊,供分析程式gprof使用.
-a
產生額外程式碼,用於輸出基本塊(basic block)的profile資訊,它記錄各個基本塊的
執行次數,供諸如 tcov此類的程式分析.但是注意,這個資料格式並非tcov期待的.最
終GNU gprof 將處理這些資料.
-ax
產生額外程式碼,用於從'bb.in'檔案讀取基本塊的profile引數,把profile的結果寫到
'bb.out' 檔案. `bb.in'包含一張函式列表.一旦進入列表中的某個函式, profile
操作就開始,離開最外層的函式後, profile操作就結束.以`-'為字首名的函式排除
在profile操作之外.如果函式名不是唯一的,它可以寫成 `/path/filename.d:func
tionname'來澄清. `bb.out'將列出一些有效的檔名.這四個函式名具有 特殊含義
: `__bb_jumps__'導致跳轉(jump)頻率寫進`bb.out'. `__bb_trace__'導致基本塊
序列透過 管道傳到`gzip',輸出`bbtrace.gz'檔案. `__bb_hidecall__'導致從跟蹤
(trace)中排除call 指令. `__bb_showret__'導致在跟蹤中包括返回指令.
-dletters
編譯的時候,在letters指定的時刻做除錯轉儲(dump).用於除錯編譯器.大多數轉儲
的檔名 透過原始檔名新增字詞獲得(例如`foo.c.rtl'或`foo.c.jump').
-dM
預處理結束的時候轉儲所有的宏定義,不輸出到檔案.
-dN
預處理結束的時候轉儲所有的宏名.
-dD
預處理結束的時候轉儲所有的宏定義,同時進行正常輸出.
-dy
語法分析(parse)的時候在標準錯誤轉儲除錯資訊.
-dr
RTL階段後轉儲到`file.rtl'.
-dx
僅對函式生成RTL,而不是編譯.通常和`r'聯用.
-dj
第一次跳轉最佳化後轉儲到`file.jump'.
-ds
CSE (包括有時候跟在CSE後面的跳轉最佳化)後轉儲到`file.cse'.
-dL
迴圈最佳化後轉儲到`file.loop'.
-dt
第二次CSE處理(包括有時候跟在CSE後面的跳轉最佳化)後轉儲到`file.cse2'.
-df
流程分析(flow analysis)後轉儲到`file.flow'.
-dc
指令組合(instruction combination)後轉儲到`file.combine'.
-dS
第一次指令安排(instruction schedule)後轉儲到`file.sched'.
-dl
區域性暫存器分配後轉儲到`file.lreg'.
-dg
全域性暫存器分配後轉儲到`file.greg'.
-dR
第二次指令安排(instruction schedule)後轉儲到`file.sched2'.
-dJ
最後一次跳轉最佳化後轉儲到`file.jump2'.
-dd
推遲分支排程(delayed branch scheduling)後轉儲到`file.dbr'.
-dk
暫存器-堆疊轉換後轉儲到`file.stack'.
-da
產生以上所有的轉儲.
-dm
執行結束後,在標準錯誤顯示記憶體使用統計.
-dp
在彙編輸出加註指明使用了哪些模式(pattern)及其替代模式.
-fpretend-float
交叉編譯的時候,假定目標機和宿主機使用同樣的浮點格式.它導致輸出錯誤的浮點
常數,但是在目標機上執行的時候, 真實的指令序列有可能和GNU CC希望的一樣.
-save-temps
儲存那些通常是``臨時''的中間檔案;置於當前目錄下,並且根據原始檔命名.因此,
用`-c -save-temps'選項編譯`foo.c '會生成` foo.cpp'和`foo.s' 以及`foo.o'文
件.
-print-file-name=library
顯示庫檔案library的全路徑名,連線時會使用這個庫---其他什麼事情都不作.根據
這個選項, GNU CC既不編譯,也不連線,僅僅顯示檔名.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-944405/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TcpDump使用手冊TCP
- MyBatis 使用手冊MyBatis
- Zabbix 使用手冊
- Anaconda使用手冊
- Mybatis應用手冊MyBatis
- sqlmap使用手冊SQL
- 儀器使用手冊
- git 基本使用手冊Git
- Cobra框架使用手冊框架
- Room Database完全使用手冊OOMDatabase
- MongoDB和pymongo自用手冊MongoDB
- 【C#】CsvHelper 使用手冊C#
- PerfDog WEB端使用手冊Web
- vim-plug使用手冊
- 【C#】AutoMapper 使用手冊C#APP
- Gerrit和Jenkins使用手冊Jenkins
- Carbon中文使用手冊(下)
- Linux parallel 命令使用手冊LinuxParallel
- ThreadLocal 使用手冊 | 按需收藏thread
- Git 快速使用手冊(二)Git
- [c++/gcc] Centos 7.9升級 gcc 4.8.5 到 gcc11 [轉]C++GCCentOS
- Cobalt strike3.0使用手冊
- 《Redis 使用手冊》- 字串(PHP 版本)Redis字串PHP
- BeautifulSoup使用手冊(查詢篇)
- ES6 完全使用手冊
- MySQL DBA 常用手冊小結MySql
- Rational ClearQuest 安裝、配置、使用手冊
- 報警系統QuickAlarm使用手冊UI
- mysql常用命令使用手冊MySql
- Canvas實用庫Fabric.js使用手冊CanvasJS
- TypeScript魔法堂:列舉的超實用手冊TypeScript
- validation客戶端驗證框架使用手冊客戶端框架
- 【Emmet 的使用手冊(知識點超全版本)】
- Microsoft PowerPoint 2019 for Mac 簡體中文安裝使用手冊ROSMac
- Kubernetes部署通用手冊 (支援版本1.19,1.18,1.17,1.16)
- WGLCOUD 使用手冊 - 監控攝像頭的狀態
- spring動態註冊bean會使AOP失效?SpringBean
- spring應用手冊-AOP(註解)-(20)-切面釋出-前置通知Spring
- spring應用手冊-IOC(XML配置實現)-(26)-注入set集合SpringXML