學習GCC[轉]

 

學習 GNU Compiler Collection

                                                   作者王聰

來源:www.zeuux.org

  • GCC 的使用
  • GCC 常用選項
  • 其它 GCC 選項
  • 相關書籍
  • 相關鏈接

1 GCC的使用

GCC 編譯過程示意圖:

用法:
       gcc [-c│-S│-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] infile...

2 GCC常用選項

選項含義
--help 
--target-help
顯示 gcc 幫助說明。‘target-help’是顯示目標機器特定的命令行選項。
--version 顯示 gcc 版本號和版權信息 。
-o outfile 輸出到指定的文件。
-x language 指明使用的編程語言。允許的語言包括:c c++ assembler none 。 ‘none’意味着恢復默認行爲,即根據文件的擴展名猜測源文件的語言。
-v 打印較多信息,顯示編譯器調用的程序。
-### 與 -v 類似,但選項被引號括住,並且不執行命令。
-E 僅作預處理,不進行編譯、彙編和鏈接。如上圖所示。
-S 僅編譯到彙編語言,不進行彙編和鏈接。如上圖所示。
-c 編譯、彙編到目標代碼,不進行鏈接。如上圖所示。
-pipe 使用管道代替臨時文件。
-combine 將多個源文件一次性傳遞給彙編器。

 

3 其他GCC選項

更多有用的GCC選項:

 

命令描述
-l library
-llibrary
進行鏈接時搜索名爲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 預定義一個名爲name的宏,值爲1。
例子: $ gcc -DTEST_CONFIG test.c -o test
-Dname=definition 預定義名爲name,值爲definition的宏。
-ggdb 
-ggdblevel
爲調試器 gdb 生成調試信息。level可以爲1,2,3,默認值爲2。
-g 
-glevel
生成操作系統本地格式的調試信息。-g 和 -ggdb 並不太相同, -g 會生成 gdb 之外的信息。level取值同上。
-s 去除可執行文件中的符號表和重定位信息。用於減小可執行文件的大小。
-M 告訴預處理器輸出一個適合make的規則,用於描述各目標文件的依賴關係。對於每個源文件,預處理器輸出 一個make規則,該規則的目標項(target)是源文件對應的目標文件名,依賴項(dependency)是源文件中 `#include引用的所有文件。生成的規則可 以是單行,但如果太長,就用`/'-換行符續成多行。規則 顯示在標準輸出,不產生預處理過的C程序。
-C 告訴預處理器不要丟棄註釋。配合`-E'選項使用。
-P 告訴預處理器不要產生`#line'命令。配合`-E'選項使用。
-static 在支持動態鏈接的系統上,阻止連接共享庫。該選項在其它系統上 無效。
-nostdlib 不連接系統標準啓動文件和標準庫文件,只把指定的文件傳遞給連接器。
Warnings
-Wall 會打開一些很有用的警告選項,建議編譯時加此選項。
-W 
-Wextra
打印一些額外的警告信息。
-w 禁止顯示所有警告信息。
-Wshadow 當一個局部變量遮蓋住了另一個局部變量,或者全局變量時,給出警告。很有用的選項,建議打開。 -Wall 並不會打開此項。
-Wpointer-arith 對函數指針或者void *類型的指針進行算術操作時給出警告。也很有用。 -Wall 並不會打開此項。
-Wcast-qual 當強制轉化丟掉了類型修飾符時給出警告。 -Wall 並不會打開此項。
-Waggregate-return 如果定義或調用了返回結構體或聯合體的函數,編譯器就發出警告。
-Winline 無論是聲明爲 inline 或者是指定了-finline-functions 選項,如果某函數不能內聯,編譯器都將發出警告。如果你的代碼含有很多 inline 函數的話,這是很有用的選項。
-Werror 把警告當作錯誤。出現任何警告就放棄編譯。
-Wunreachable-code 如果編譯器探測到永遠不會執行到的代碼,就給出警告。也是比較有用的選項。
-Wcast-align 一旦某個指針類型強制轉換導致目標所需的地址對齊增加時,編譯器就發出警告。
-Wundef 當一個沒有定義的符號出現在 #if 中時,給出警告。
-Wredundant-decls 如果在同一個可見域內某定義多次聲明,編譯器就發出警告,即使這些重複聲明有效並且毫無差別。
Optimization
-O0 禁止編譯器進行優化。默認爲此項。
-O 
-O1
嘗試優化編譯時間和可執行文件大小。
-O2 更多的優化,會嘗試幾乎全部的優化功能,但不會進行“空間換時間”的優化方法。
-O3 在 -O2 的基礎上再打開一些優化選項:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
-Os 對生成文件大小進行優化。它會打開 -O2 開的全部選項,除了會那些增加文件大小的。
-finline-functions 把所有簡單的函數內聯進調用者。編譯器會探索式地決定哪些函數足夠簡單,值得做這種內聯。
-fstrict-aliasing 施加最強的別名規則(aliasing rules)。
Standard
-ansi 支持符合ANSI標準的C程序。這樣就會關閉GNU C中某些不兼容ANSI C的特性。
-std=c89 
-iso9899:1990
指明使用標準 ISO C90 作爲標準來編譯程序。
-std=c99 
-std=iso9899:1999
指明使用標準 ISO C99 作爲標準來編譯程序。
-std=c++98 指明使用標準 C++98 作爲標準來編譯程序。
-std=gnu9x 
-std=gnu99
使用 ISO C99 再加上 GNU 的一些擴展。
-fno-asm 不把asm, inline或typeof當作關鍵字,因此這些詞可以用做標識符。用 __asm__, __inline__和__typeof__能夠替代它們。 `-ansi' 隱含聲明瞭`-fno-asm'。
-fgnu89-inline 告訴編譯器在 C99 模式下看到 inline 函數時使用傳統的 GNU 句法。
C options
-fsigned-char 
-funsigned-char
把char定義爲有/無符號類型,如同signed char/unsigned char。
-traditional 嘗試支持傳統C編譯器的某些方面。詳見GNU C手冊。
-fno-builtin 
-fno-builtin-function
不接受沒有 __builtin_ 前綴的函數作爲內建函數。
-trigraphs 支持ANSI C的三聯符( trigraphs)。`-ansi'選項隱含聲明瞭此選項。
-fsigned-bitfields 
-funsigned-bitfields
如果沒有明確聲明`signed'或`unsigned'修飾符,這些選項用來定義有符號位域或無符號位域。缺省情況下,位域是有符號的,因爲它們繼承的基本整數類型,如int,是有符號數。
-Wstrict-prototypes 如果函數的聲明或定義沒有指出參數類型,編譯器就發出警告。很有用的警告。
-Wmissing-prototypes 如果沒有預先聲明就定義了全局函數,編譯器就發出警告。即使函數定義自身提供了函數原形也會產生這個警告。這個選項 的目的是檢查沒有在頭文件中聲明的全局函數。
-Wnested-externs 如果某extern聲明出現在函數內部,編譯器就發出警告。
C++ options
-ffor-scope 從頭開始執行程序,也允許進行重定向。
-fno-rtti 關閉對 dynamic_cast 和 typeid 的支持。如果你不需要這些功能,關閉它會節省一些空間。
-Wctor-dtor-privacy 當一個類沒有用時給出警告。因爲構造函數和析構函數會被當作私有的。
-Wnon-virtual-dtor 當一個類有多態性,而又沒有虛析構函數時,發出警告。-Wall會開啓這個選項。
-Wreorder 如果代碼中的成員變量的初始化順序和它們實際執行時初始化順序不一致,給出警告。
-Wno-deprecated 使用過時的特性時不要給出警告。
-Woverloaded-virtual 如果函數的聲明隱藏住了基類的虛函數,就給出警告。
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位機器上的代碼。
-mpush-args 
-mno-push-args
(不)使用 push 指令來進行存儲參數。默認是使用。
-mregparm=num 當傳遞整數參數時,控制所使用寄存器的個數。

 

4 GCC相關書籍

 

 

5 相關鏈接

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章