常用選項
常用選項 | 含義 |
-o | 指定輸出檔案名為file,這個名稱不能跟源檔案名同名。(若直接gcc hello.c則會産生a.out) |
-E | 隻預處理,不編譯、彙編、連結。 //用到arm-linux-cpp,一般輸出 .i 檔案 例: gcc -E hello.c > pianoapan.txt |
-S | 隻預處理和編譯,不彙編、連結,生成彙編代碼(.s)。 //用到cc1 (就是cc1,不是arm-linux-cc1), 例: gcc -S hello.c //将生成.s的彙編代碼,您能夠用文本編輯器檢視 |
-c | 預處理、編譯和彙編,不連結,生成ELF目标檔案(.o檔案)(OBJ檔案) //用到arm-linux-as 例: gcc -c hello.c //将生成.o的obj文檔 |
--version | 顯示 gcc 版本号和版權資訊 。 |
-v | 顯示制作GCC工具時自身的配置(路徑、選項等);同時顯示編譯器驅動程式、預處理器 、編譯器的版本号 |
--help --target-help | 顯示 gcc 幫助說明。‘--target-help’是顯示目标機器特定的指令行選項。 |
1. 編譯過程中,除非使用-E、-S、-c選項(或編譯出錯阻止了完整的編譯過程),否則最後的步驟都是連結。
2. 預處理、編譯、彙編、連接配接所做的事情,詳見《嵌入式Linux嵌入式開發完全手冊.pdf》
3. 預處理、編譯、彙編這三步,一般統稱為編譯
4. 一般用 gcc -c -o a.o a.c; gcc -c -o b.o b.c,最後用 ld -o test a.o b.o來生成可執行程式。(gcc -o test a.o b.o也可以。前邊做了編譯,是以此步隻會連接配接)
全局選項
全局選項 | 含義 |
-Dmacro | 相當于C語言中的#define macro 。其預設為:#define macro 1 |
-Dmacro=defn | 相當于C語言中的#define macro defn 。例:-DPI=3.14 即:#define PI 3.14 |
-Umacro | 相當于C語言中的#undef macro |
-undef | 取消對任何非标準宏的定義 |
-x language filename | 設定文檔所使用的語言,使字尾名無效,對以後的多個有效.也就是根據約定C語言的字尾名稱是.c的,而C++的字尾名是.C或.cpp。例:假如C代碼文檔的字尾名是.pig 哈哈,那您就要用這個參數,這個參數對他後面的文檔名都起作用,除非到了下一個參數的使用。 能夠使用的參數有下面的這些 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'. 例: gcc -x c hello.pig |
-x none filename | 關掉上一個選項,也就是讓gcc根據文檔名字尾,自動識别文檔類型 例: gcc -x c hello.pig -x none hello2.c |
-pipe | 在編譯過程的不同階段之間使用管道而非臨時檔案進行通信,可以加快編譯速度。建議使用。 gcc -pipe -o hello.exe hello.c |
-fno-strict-prototype | 隻對g++起作用,使用這個選項,g++将對不帶參數的函數,都認為是沒有顯式的對參數的個數和類型說明,而不是沒有參數。 而gcc無論是否使用這個參數,都将對沒有帶參數的函數,認為是沒有顯式說明的類型 |
-fthis-is-varialble | 就是向傳統c++看齊,能夠使用this當一般變量使用. |
-fcond-mismatch | 允許條件表達式的第二和第三參數類型不比對,表達式的值将為void類型 |
-funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char | 這四個參數是對char類型進行配置,決定将char類型配置成unsigned char(前兩個參數)或 signed char(後兩個參數) |
-imacros file | 将file文檔的宏,擴充到gcc/g++的輸入文檔,宏定義本身并不出現在輸入文檔中 |
-C | 告訴預處理器不要丢棄注釋。配合`-E'選項使用。 |
-P | 告訴預處理器不要産生`#line'指令。配合`-E'選項使用。 |
頭檔案選項
頭檔案選項 | 含義 |
-I dir | 把dir加到頭檔案的搜尋路徑中,而且gcc會在搜尋标準頭檔案之前先搜尋dir。一般直接寫絕對 路徑。如果頭檔案的路徑在本.c檔案同級目錄下,可用-I . 。 #include "c.h"先在同級目錄搜尋,#include 尖括号 先去-I指定的路徑以及編譯器路徑搜尋。 |
-I- | 取消前一個參數的功能,是以一般在-Idir之後使用 |
-idirafter dir | 在-I的目錄裡面查找失敗,将到這個目錄裡面查找 |
-iprefix prefix -iwithprefix dir | 一般一起使用,當-I的目錄查找失敗,會到prefix+dir下查找 |
-nostdinc | 使編譯器不再系統預設的頭文檔目錄裡面找頭文檔,一般和-I聯合使用,明确限定頭文檔的位置 |
-nostdin C++ | 規定不在g++指定的标準路經中搜尋,但仍在其他路徑中搜尋,.此選項在創libg++庫使用 |
--sysroot=dir | 将dir作為邏輯根目錄。比如編譯器通常會在 /usr/include 和 /usr/lib 中搜尋頭檔案和庫,使用這個選項後将在 dir/usr/include 和 dir/usr/lib 目錄中搜尋。如果使用這個選項的同時又使用了 -isysroot 選項,則此選項僅作用于庫檔案的搜尋路徑,而 -isysroot 選項将作用于頭檔案的搜尋路徑。這個選項與優化無關,但是在 CLFS 中有着神奇的作用。 |
-include file | 包含某個代碼,簡單來說,就是便以某個文檔,需要另一個文檔的時候,就能夠用他設定,功能就相當于在代碼中使用#include<filename> 例: gcc hello.c -include /root/pianopan.h |
連結選項
更多選項可以:man ld
連接配接器 | 含義 |
-L dir | 把dir加到庫檔案的搜尋路徑中,而且gcc會在搜尋标準庫檔案之前先搜尋dir。一般直接寫絕對路徑。 如果庫檔案的路徑是本.o檔案同級目錄下的lib目錄,可用-L lib 如果庫檔案路徑是本.o檔案同級目錄,可用-L. 例: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test |
-llibrary | 在連接配接的時候搜尋library庫。如: -lc是連結libc庫檔案,-lm是連結math庫檔案。 例: $ gcc test.c -lm -o test |
-nostartfiles | 不連接配接系統标準啟動檔案,而标準庫檔案仍然正常使用。crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o是gcc加入的系統标準啟動檔案,一般應用程式需要這些啟動檔案 |
-nostdlib | 不連接配接系統标準啟動檔案和标準庫檔案,隻把指定的檔案傳遞給連接配接器。 常用于編譯核心、bootloader、裸機等程式,它們不需要啟動檔案、标準庫檔案, |
-static | 在支援動态連結的系統上阻止連接配接共享庫,編譯出來的可執行程式大小很大。 例:gcc -static -o hello_static hello.o 不使用時,程式執行前要連接配接共享庫檔案,是以還需要将共享庫放入檔案系統 |
-shared | 跟ar工具一樣,生成共享OBJ檔案(.a檔案),它可以和其他OBJ檔案連接配接産生可執行檔案。 示例1 當不想以源代碼釋出程式時,可以使用“-shared”選項生成庫檔案,如下: gcc -c -o sub.o sub.c gcc -c -o main.o main.c gcc -shared -o sub.a sub.o // 等價于ar cr sub.a sub.o 以後要使用sub.c中的sub_fun函數時,在連接配接程式時,将sub.a加入即可: gcc -o test main.o ./sub.a //必須是./sub.a,如果省略 ./ ,會出錯,sub.a将不被包含進去。 可将多個檔案制作為一個庫檔案: gcc -shared -o sub.a sub.o sub1.o sub2.o //等價于 ar cr sub.a sub1.o sub2.o 示例2 -shared -fPIC 可以用來生成動态庫(.so檔案) gcc -shared -fPIC -o libfunc.so func.o |
LDFLAGS
更多選項可以:man ld
選項 | 含義 |
-s | 去除可執行檔案中的符号表和重定位資訊,用于減小可執行檔案的大小。 例: gcc -s source_file.c strip指令: 等于程式做了--strip-debug和--strip-symbol,可以減小大小。 對于靜态庫.a之類的檔案,不能用strip指令,隻能用--strip-debug。 對于動态庫,可以用strip。 strip指令可以處理可執行檔案、目标檔案、動态庫檔案。 |
-Wl,options options是由一個或多個逗号分隔的傳遞給連結器的選項清單。其中的每一個選項均會作為指令行選項 提供給連結器。 | |
-Wl,-rpath=dir 或-Wl,-rpath dir | 程式運作時,優先到rpath指定的目錄去尋找依賴庫。 程式連結時,在指定的目錄中,隐式的連結那些動态庫所需要的連結庫。 例如: 有動态庫libtest.so,可執行程式test1,libtest.so放在test1同目錄下,則編譯test1時需要添加以下選項: -L./ -ltest -Wl,-rpath=./ |
-Wl,--as-needed | 不連結用不到的的符号引用(動态庫)。 程式中有一些用不到的動态庫,但它運作時仍然會被加載進去,如果不連結這些用不到的動态庫,可以加快程序啟動速度。 |
-Wl,-On | 當n>0時将會優化輸出,但是會明顯增加連接配接操作的時間,這個選項是比較安全的。 |
-Wl,--exclude-libs=ALL | 不自動導出庫中的符号,也就是預設将庫中的符号隐藏。 |
-Wl,-m<emulation> | 仿真<emulation>連接配接器,目前ld所有可用的仿真可以 通過"ld -V"指令擷取。預設值取決于ld的編譯時配置。 |
-Wl,--sort-common | 把全局公共符号按照大小排序後放到适當的輸出節,以防止符号間因為排布限制而出現間隙。 |
-Wl,-x | 删除所有的本地符号。 |
-Wl,-X | 删除所有的臨時本地符号。對于大多數目标平台,就是所有的名字以'L'開頭的本地符号。 |
-Wl,-zcomberloc | 組合多個重定位節并重新排布它們,以便讓動态符号可以被緩存。 |
-Wl,--enable-new-dtags | 在ELF中建立新式的"dynamic tags",但在老式的ELF系統上無法識别。 |
-Wl,--no-define-common | 限制對普通符号的位址配置設定。該選項允許那些從共享庫中引用的普通符号隻在主程式 中被配置設定位址。這會消除在共享庫中的無用的副本的空間,同時也防止了在有多個指定了搜尋路徑的動态子產品在進行運作時符号解析時引起的混亂。 |
-Wl,--hash-style=gnu | 使用gnu風格的符号散清單格式。它的動态連結性能比傳統的sysv風格(預設)有 較大提升,但是它生成的可執行程式和庫與舊的Glibc以及動态連結器不相容。 |
依賴選項
依賴選項 | 含義 |
-M | 生成文檔關聯的資訊。包含目标文檔所依賴的任何源代碼。例:gcc -M hello.c 對于每個源檔案,預處理器輸出一個make規則,該規則的目标項(target)是源檔案對應的目标檔案名,依賴項(dependency)是源檔案中 #include引用的所有檔案。生成的規則可以是單行,但如果太長,就用`\'-換行符續成多行。規則顯示在标準輸出,不産生預處理過的C程式。 |
-MM | 和上面的那個相同,但是他将忽略由#include<file>造成的依賴關系。 |
-MD | 和-M相同,但是輸出将導入到.d的文檔裡面 |
-MMD | 和-MM相同,但是輸出将導入到.d的文檔裡面 |
-Wa,option | 此選項傳遞option給彙程式設計式;假如option中間有逗号,就将option分成多個選項,然後傳遞給會彙程式設計式 |
-Wl.option | 此選項傳遞option給連接配接程式;假如option中間有逗号,就将option分成多個選項,然後傳遞給會連接配接程式. |
調試選項
調試選項 | 含義 |
-g -glevel | 生成作業系統本地格式的調試資訊。-g 和 -ggdb 并不太相同, -g 會生成 gdb 之外的資訊。level可以為1,2,3,預設值為2。 |
-gstabs | 此選項以stabs格式聲稱調試資訊,但是不包括gdb調試資訊. |
-gstabs+ | 此選項以stabs格式聲稱調試資訊,并且包含僅供gdb使用的額外調試資訊. |
-ggdb -ggdblevel | 此選項将盡可能的生成gdb的能夠使用的調試資訊. level可以為1,2,3,預設值為2。 |
-fprofile-arcs | 在使用這一選項編譯程式并運作它以建立包含每個代碼塊的執行次數的檔案後,程式可以再次使用 -fbranch-probabilities 編譯,檔案中的資訊可以用來優化那些經常選取的分支。如果沒有這些資訊,gcc将猜測哪個分支将被經常運作以進行優化。這類優化資訊将會存放在一個以源文 件為名字的并以".da"為字尾的檔案中。 |
警告選項
警告選項 | 含義 |
-Wall | 可以使用-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時所有的警告都變成錯誤,使出現警告時也停止編譯.需要和指定警告的參數一起使用. |
-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 中時,給出警告。 |
優化選項
優化選項 | 含義 |
-O0 | 禁止編譯器進行優化。預設為此項。編譯較快,編譯結果可調試,語句獨立 |
-O -O1 | 嘗試優化編譯時間和可執行檔案大小。編譯慢,結果不可調試,語句不獨立 |
-O2 | 更多的優化,會嘗試幾乎全部的優化功能,但不會進行“空間換時間”的優化方法。 |
-O3 | 在 -O2 的基礎上再打開一些優化選項: -finline-functions 允許編譯器選擇某些簡單的函數在其被調用處展開,比較安全的選項,特别是在CPU二級緩存較大時建議使用。 -funswitch-loops 将循環體中不改變值的變量移動到循環體之外。 -fgcse-after-reload 為了清除多餘的溢出,在重載之後執行一個額外的載入消除步驟。 |
-Os | 對生成檔案大小進行優化。它會打開 -O2 開的全部選項,除了會那些增加檔案大小的。 |
-finline-functions | 把所有簡單的函數内聯進調用者。編譯器會探索式地決定哪些函數足夠簡單,值得做這種内聯。 |
-fstrict-aliasing | 施加最強的别名規則(aliasing rules)。 |
-fomit-frame-pointer | 對于不需要棧指針的函數就不在寄存器中儲存指針,是以可以忽略存儲和檢索位址的代 碼,同時對許多函數提供一個額外的寄存器。所有"-O"級别都打開它,但僅在調試器可以不依靠棧指針運作時才有效。在AMD64平台上此選項預設打開,但 是在x86平台上則預設關閉。建議顯式的設定它。 |
-falign-functions=N -falign-jumps=N -falign-loops=N -falign-labels=N | 這 四個對齊選項在"-O2"中打開,其中的根據不同的平台N使用不同的預設值。如果你想指定不同于預設值的N,也可以單獨指定。比如,對于L2- cache>=1M的cpu而言,指定 -falign-functions=64 可能會獲得更好的性能。建議在指定了 -march 的時候不明确指定這裡的值。 |
-fforce-addr | 必須将位址複制到寄存器中才能對他們進行運算。由于所需位址通常在前面已經加載到寄存器中了,是以這 個選項可以改進代碼。 |
-finline-limit=n | 對僞指令數超過n的函數,編譯程式将不進行内聯展開,預設為600。增大此值将增加編譯時間 和編譯記憶體用量并且生成的二進制檔案體積也會變大,此值不宜太大。 |
-fmerge-all-constants | 試圖将跨編譯單元的所有常量值和數組合并在一個副本中。但是标準C/C++要求每 個變量都必須有不同的存儲位置,是以該選項可能會導緻某些不相容的行為。 |
-fgcse-sm | 在全局公共子表達式消除之後運作存儲移動,以試圖将存儲移出循環。gcc-3.4中曾屬于"-O2"級别的 選項。 |
-fgcse-las | 在全局公共子表達式消除之後消除多餘的在存儲到同一存儲區域之後的加載操作。gcc-3.4中曾屬于"-O2"級别的選項。 |
-floop-optimize | 已廢除(GCC-4.1曾包含在"-O1"中)。 |
-floop-optimize2 | 使用改進版本的循環優化器代替原來"-floop-optimize"。該優化器将使用不同 的選項(-funroll-loops, -fpeel-loops, -funswitch-loops, -ftree-loop-im)分别控制循環優化的不同方面。目前這個新版本的優化器尚在開發中,并且生成的代碼品質并不比以前的版本高。已廢除,僅存在 于GCC-4.1之前的版本中。 |
-funsafe-loop-optimizations | 假定循環不會溢出,并且循環的退出條件不是無窮。這将可以在一個比較 廣的範圍内進行循環優化,即使優化器自己也不能斷定這樣做是否正确。 |
-fsched-spec-load | 允許一些裝載指令執行一些投機性的動作。 |
-ftree-loop-linear | 在trees上進行線型循環轉換。它能夠改進緩沖性能并且允許進行更進一步的循環優化。 |
-fivopts | 在trees上執行歸納變量優化。 |
-ftree-vectorize | 在trees上執行循環向量化。 |
-ftracer | 執行尾部複制以擴大超級塊的尺寸,它簡化了函數控制流,進而允許其它的優化措施做的更好。據說挺有效。 |
-funroll-loops | 僅對循環次數能夠在編譯時或運作時确定的循環進行展開,生成的代碼尺寸将變大,執行速度可能變快 也可能變慢。 |
-fprefetch-loop-arrays | 生成數組預讀取指令,對于使用巨大數組的程式可以加快代碼執行速度,适合資料庫 相關的大型軟體等。具體效果如何取決于代碼。 |
-fweb | 建立經常使用的緩存器網絡,提供更佳的緩存器使用率。gcc-3.4中曾屬于"-O3"級别的選項。 |
-ffast-math | 違反IEEE/ANSI标準以提高浮點數計算速度,是個危險的選項,僅在編譯不需要嚴格遵守IEEE規範且浮點計算密集的程式考慮采用。 |
-fsingle-precision-constant | 将浮點常量作為單精度常量對待,而不是隐式地将其轉換為雙精度。 |
-fbranch-probabilities | 在使用 -fprofile-arcs 選項編譯程式并執行它來建立包含每個代碼塊執行次數的檔案之後,程式可以利用這一選項再次編譯,檔案中所産生的資訊将被用來優化那些經常發生的分支代碼。 如果沒有這些資訊,gcc将猜測那一分支可能經常發生并進行優化。這類優化資訊将會存放在一個以源檔案為名字的并以".da"為字尾的檔案中。 |
-frename-registers | 試圖驅除代碼中的假依賴關系,這個選項對具有大量寄存器的機器很有效。gcc-3.4中 曾屬于"-O3"級别的選項。 |
-fbranch-target-load-optimize -fbranch-target-load-optimize2 | 在 執行序啟動以及結尾之前執行分支目标緩存器加載最佳化。 |
-fstack-protector | 在關鍵函數的堆棧中設定保護值。在傳回位址和傳回值之前,都将驗證這個保護值。如果出現了 緩沖區溢出,保護值不再比對,程式就會退出。程式每次運作,保護值都是随機的,是以不會被遠端猜出。 |
-fstack-protector-all | 同上,但是在所有函數的堆棧中設定保護值。 |
--param max-gcse-memory=xxM | 執行GCSE優化使用的最大記憶體量(xxM),太小将使該優化無法進 行,預設為50M。 |
--param max-gcse-passes=n | 執行GCSE優化的最大疊代次數,預設為 1。 |
代碼生成選項
選項 | 含義 |
-fno-bounds-check | 關閉所有對數組通路的邊界檢查。該選項将提高數組索引的性能,但當超出數組邊界時,可能會 造成不可接受的行為。 |
-freg-struct-return | 如果struct和union足夠小就通過寄存器傳回,這将提高較小結構的效率。如果 不夠小,無法容納在一個寄存器中,将使用記憶體傳回。建議僅在完全使用GCC編譯的系統上才使用。 |
-fPIC 或-fpic | 生成可用于共享庫的位置獨立代碼。-shared -fPIC組合可以生成動态庫(.so檔案)。 所有的内部尋址均通過全局偏移表完成。要确定一個位址,需要将代碼自身的記憶體位置 作為表中一項插入。該選項産生可以在共享庫中存放并從中加載的目标子產品。 不用此選項的話編譯後的代碼是位置相關的是以動态載入時是通過代碼拷貝的方式來滿足不同程序的需要,而不能達到真正代碼段共享的目的。 |
-fstack-check | 為防止程式棧溢出而進行必要的檢測,僅在多線程環境中運作時才可能需要它。 |
-fvisibility=hidden | 設定預設的ELF鏡像中符号的可見性為隐藏。使用這個特性可以非常充分的提高連接配接和加 載共享庫的性能,生成更加優化的代碼,提供近乎完美的API輸出和防止符号碰撞。我們強烈建議你在編譯任何共享庫的時候使用該選項。參見 -fvisibility-inlines-hidden 選項 |
标準及語言選項
标準及語言選項 | 描述 |
标準類 | |
-ansi | 支援符合ANSI标準的C程式。這樣就會關閉GNU C中某些不相容ANSI C的特性。(包括禁止一些asm inline typeof關鍵字,連同UNIX,vax等預處理宏 |
-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語言選項 | |
-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++選項 | |
-ffor-scope | 從頭開始執行程式,也允許進行重定向。 |
-fno-rtti | 關閉對 dynamic_cast 和 typeid 的支援。如果你不需要這些功能,關閉它會節省一些空間。 |
-Wctor-dtor-privacy | 當一個類沒有用時給出警告。因為構造函數和析構函數會被當作私有的。 |
-Wnon-virtual-dtor | 當一個類有多态性,而又沒有虛析構函數時,發出警告。-Wall會開啟這個選項。 |
-Wreorder | 如果代碼中的成員變量的初始化順序和它們實際執行時初始化順序不一緻,給出警告。 |
-Wno-deprecated | 使用過時的特性時不要給出警告。 |
-Woverloaded-virtual | 如果函數的聲明隐藏住了基類的虛函數,就給出警告。 |
機器依賴選項
(僅針對x86和x86_64)
選項 | 含義 |
-mtune=cpu-type | 為特定的cpu-type編譯二進制代碼(不能在更低級别的cpu上運作)。 Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona, core2(GCC-4.3新增) 。 AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx) |
-msse -msse2 -mmmx -mno-sse -mno-sse2 -mno-mmx -mssse3(GCC-4.3 新增) -msse4.1(GCC-4.3新增) -msse4.2(GCC-4.3新增) -msse4(含4.1和 4.2,GCC-4.3新增) | 是否使用相應的擴充指令集以及内置函數,按照自己的cpu選擇 |
-m32/-m64 | 生成32位/64位機器上的代碼。 |
-mpush-args -mno-push-args | (不)使用 push 指令來進行存儲參數。預設是使用。 |
-mregparm=num | 當傳遞整數參數時,控制所使用寄存器的個數。 |
-mfpmath=sse | P3和athlon-xp級别及以上的cpu支援"sse"标量浮點指令。僅建議在P4和K8以上級 别的處理器上使用該選項。 |
-malign-double | 将double, long double, long long對齊于雙位元組邊界上;有助于生成更高速的代碼,但是程式的尺寸會變大,并且不能與未使用該選項編譯的程式一起工作。 |
-m128bit-long-double | 指定long double為128位,pentium以上的cpu更喜歡這種标準,并且符合x86-64的ABI标準,但是卻不附合i386的ABI标準。 |
-mregparm=N | 指定用于傳遞整數參數的寄存器數目(預設不使用寄存器)。0<=N<=3 ;注意:當N>0時你必須使用同一參數重新建構所有的子產品,包括所有的庫。 |
-msseregparm | 使用SSE寄存器傳遞float和double參數和傳回值。注意:當你使用了這個選項以後,你必須 使用同一參數重新建構所有的子產品,包括所有的庫。 |
-maccumulate-outgoing-args | 指定在函數引導段中計算輸出參數所需最大空間,這在大部分現代cpu中 是較快的方法;缺點是會明顯增加二進制檔案尺寸。 |
-mthreads | 支援Mingw32的線程安全異常處理。對于依賴于線程安全異常處理的程式,必須啟用這個選項。使用這個選 項時會定義"-D_MT",它将包含使用選項"-lmingwthrd"連接配接的一個特殊的線程輔助庫,用于為每個線程清理異常處理資料。 |
-minline-all-stringops | 預設時GCC隻将确定目的地會被對齊在至少4位元組邊界的字元串操作内聯程序式代 碼。該選項啟用更多的内聯并且增加二進制檔案的體積,但是可以提升依賴于高速 memcpy, strlen, memset 操作的程式的性能。 |
-minline-stringops-dynamically | GCC-4.3新增。對未知尺寸字元串的小塊操作使用内聯代 碼,而對大塊操作仍然調用庫函數,這是比"-minline-all-stringops"更聰明的政策。決定政策的算法可以通 過"-mstringop-strategy"控制。 |
-momit-leaf-frame-pointer | 不為葉子函數在寄存器中儲存棧指針,這樣可以節省寄存器,但是将會使調試 變的困難。注意:不要與 -fomit-frame-pointer 同時使用,因為會造成代碼效率低下。 |
-mcmodel=small | [預設值]程式和它的符号必須位于2GB以下的位址空間。指針仍然是64位。程式可以靜态連接配接也 可以動态連接配接。僅用于x86_64[含EMT64]環境。 |
-mcmodel=kernel | 核心運作于2GB位址空間之外。在編譯linux核心時必須使用該選項!僅用于 x86_64[含EMT64]環境。 |
-mcmodel=medium | 程式必須位于2GB以下的位址空間,但是它的符号可以位于任何位址空間。程式可以靜态連接配接也可 以動态連接配接。注意:共享庫不能使用這個選項編譯!僅用于x86_64[含EMT64]環境。 |
傳遞給彙編器的選項
選項 | 含義 |
-Wa,options | options是一個或多個由逗号分隔的可以傳遞給彙編器的選項清單。其中的每一個均可作為指令行選項 傳遞給彙編器。 |
-Wa,--strip-local-absolute | 從輸出符号表中移除局部絕對符号。 |
-Wa,-R | 合并資料段和正文段,因為不必在資料段和代碼段之間轉移,是以它可能會産生更短的位址移動。 |
-Wa,--64 | 設定字長為64bit,僅用于x86_64,并且僅對ELF格式的目标檔案有效。此外,還需要使 用"--enable-64-bit-bfd"選項編譯的BFD支援。 |
-Wa,-march=CPU | 按照特定的CPU進行優化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 。 |
僅可用于 CFLAGS 的選項
選項 | 含義 |
-fhosted | 按宿主環境編譯,其中需要有完整的标準庫,入口必須是main()函數且具有int型的傳回值。核心以外幾乎 所有的程式都是如此。該選項隐含設定了 -fbuiltin,且與 -fno-freestanding 等價。 |
-ffreestanding | 按獨立環境編譯,該環境可以沒有标準庫,且對main()函數沒有要求。最典型的例子就是操作系 統核心。該選項隐含設定了 -fno-builtin,且與 -fno-hosted 等價。 |
僅可用于 CXXFLAGS 的選項
選項 | 含義 |
-fno-enforce-eh-specs | C++标準要求強制檢查異常違例,但是該選項可以關閉違例檢查,進而減小生成代碼 的體積。該選項類似于定義了"NDEBUG"宏。 |
-fno-rtti | 如果沒有使用'dynamic_cast'和'typeid',可以使用這個選項禁止為包含虛方法的類生成 運作時表示代碼,進而節約空間。此選項對于異常處理無效(仍然按需生成rtti代碼)。 |
-ftemplate-depth-n | 将最大模版執行個體化深度設為'n',符合标準的程式不能超過17,預設值為500。 |
-fno-optional-diags | 禁止輸出診斷消息,C++标準并不需要這些消息。 |
-fno-threadsafe-statics | GCC自動在通路C++局部靜态變量的代碼上加鎖,以保證線程安全。如果你不 需要線程安全,可以使用這個選項。 |
-fvisibility-inlines-hidden | 預設隐藏所有内聯函數,進而減小導出符号表的大小,既能縮減檔案的大 小,還能提高運作性能,我們強烈建議你在編譯任何共享庫的時候使用該選項。參見 -fvisibility=hidden 選項。 |
系統環境變量
變量 | 含義 |
LANG | 指定編譯程式使用的字元集,可用于建立寬字元檔案、串文字、注釋;預設為英文。[目前隻支援日文"C-JIS,C- SJIS,C-EUCJP",不支援中文] |
LC_ALL | 指定多位元組字元的字元分類,主要用于确定字元串的字元邊界以及編譯程式使用何種語言發出診斷消息;預設設定與 LANG相同。中文相關的幾項:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"。 |