gcc 編譯
一、基本常用選項
gcc/g++ 在執行編譯時,需要4步(-E,S,c,o選項隻會出現一個,不會同時出現,一個都沒有則預設為-o)
1.預處理,生成.i的檔案[使用-E參數]
2.将預處理後的檔案不轉換成彙編語言,生成檔案.s[使用-S參數]
3.有彙編變為目标代碼(機器代碼)生成.o的檔案[使用-c參數]
4.連接配接目标代碼,生成可執行程式[使用-o參數]
-E
隻激活預處理,這個不生成檔案,你需要把他重定向到一個輸出檔案裡面.
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
慢慢看吧,一個hello word 也要預處理成800行的代碼
-S 隻激活預處理和編譯,就是指把檔案編譯成為彙編代碼。
# gcc -S hello.c
他将生成同名.S的asm檔案
-c 隻激活預處理,編譯,和彙編,也就是他隻把程式做成obj檔案,而不進行連結;沒有該選項還要進行連結
# gcc -c hello.c
他将生成同名.o的obj檔案
-o filename 激活預處理,編譯,彙編和連結,指定生産可執行檔案的名字。
gcc hello.c (無選項)編譯并連結hello.c(前邊不帶任何選項),預設為-o生成可執行程式名a.out
-I /dir/ 指定編譯時,包含的.h檔案路勁,即在頭檔案的搜尋路徑清單中添加dir目錄
# gcc -I /dir/ hello.c -o hello
-Llibpath (預設庫usr/lib/:/lib)指定使用到的包含的庫路勁,
#gcc -I/home/foo -L/home/foo -ltest test.c -o test
-llibname 在連結時,指定具體的庫 #gcc test.c -lm -o test 編譯時連結名為libm.so的庫
-static 靜态連結(用于生成.ELF)。把庫檔案連結到.elf檔案中(.a靜态庫,.so動态庫;預設是動态連結)
# gcc -static hello.c -o hello.o
-shared (用于生成動态連結庫.so)
此選項将盡量使用動态庫,是以生成檔案比較小,不過需要系統由動态庫
.$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
-D MICRO 編譯前,定義一個宏MICRO gcc -D YES hello.c -o hello 相當于#define YES
-g 編譯時,添加調試資訊 gcc -g -c hello.c -o hello
-Wall 編譯時生成所有的警告資訊 gcc -Wall hello.c -o hello
-w 編譯時不生成任何警告資訊 gcc -w hello.c -o hello
-O0,-O1(-O),-O2,-Os,-O3 在編譯時,對程式進行優化(gcc提供了5種不同的優化方式)
-pipe 使用管道代替臨時檔案
-x language filename
設定檔案所使用的語言,使字尾名無效,對以後的多個有效.也就是根據約定,C語言的字尾名稱是.c的,而C++的字尾名是.C或.cpp,如果你非常個性,決定你的C代碼檔案的字尾名是.pig 哈哈,那你就要用這個參數,這個參數對他後面的檔案名都起作用,除非到了下一個參數的使用。能使用的參數有下面的這些:
`c’, `objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’, and `assembler-with-cpp’.
例子用法: cd..
gcc -x c hello.pig
-x none filename
關掉上一個選項,也就是讓gcc根據檔案名字尾,自動識别檔案類型
gcc -x c hello.pig -x none hello2.c
time ./hello 可以記錄hello運作的時間
二、其他額外選項
gcc --help 顯示gcc幫助說明
-M
告訴預處理器輸出一個适合make的規則,用于描述各目标檔案的依賴關系。對于每個 源檔案,預處理器輸出 一個make規則,該規則的目标項(target)是源檔案對應的目标檔案名,依賴項(dependency)是源檔案中 `#include引用的所有檔案。生成的規則可 以是單行,但如果太長,就用`\'-換行符續成多行。規則 顯示在标準輸出,不産生預處理過的C程式
-C
告訴預處理器不要丢棄注釋。配合`-E'選項使用。
-P
告訴預處理器不要産生`#line'指令。配合`-E'選項使用。
-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 指令來進行存儲參數。預設是使用。