gcc和g 常用編譯引數

2022-05-09 00:54:12 字數 1777 閱讀 1848

-w -w -wall

-w 關閉編譯警告。平時編寫c/c++**如果不規範,編譯的時候會丟擲很多警告。但是一般的警告都是可以忽略的,比如型別轉換。編譯的時候可以加-w關閉警告

-w 也是關閉編譯警告,但是比-w智慧型一些,它只會顯示編輯器認為會出錯的警告

-wall, 顯示所有警告。

比如下面的**,test.c

gcc -o a.out test.c -wall,   把所有的警告都顯示出來了,沒有使用的變數i,在void函式返回了double。

gcc -o a.out test.c -w, 只顯示了編譯器認為會出錯的警告, 沒有使用變數i的那個警告編譯器認為不會出錯,所以沒有輸出。

gcc -o a.out test.c -w,  遮蔽了所有警告,只輸出錯誤

-g   -g3

gcc 支援4中級別的除錯資訊,-g0表示不生成除錯資訊,-g3表示生成最多的除錯資訊。-g預設為-g2。一般的除錯資訊包括行號,函式,外部變數。-g3包含其他額外的除錯資訊,比如巨集定義。

-o1 -o2 -o3 -os

-o系列選項主要用於優化**。

-o和-o1是等價的,不影響編譯速度,並且會採用一些優化演算法,降低**大小並提高**執行速度。

-o2,會降低編譯速度,但是除了包含-o1的優化演算法之外,還會採用一些其他的優化演算法來提高**執行速度。

-o3,除了包含-o2所有的優化外,會採取一些向量化演算法,提高**的並行執行程度,使之更充分地利用現代cpu的流水線和cache。

-os,-o3即使是增加**的大小,也要提高執行速度。而這個選項在-o2的基礎上,儘量減少目標的大小,這個經常用於儲存量比較小的裝置。

-fno-strict-aliasing

當優化級別在-o2即以上時,strict-aliasing會被採用。 編譯器會假設**中沒有強制轉換,從而會使用更加激進的優化演算法對**進行優化。也就是說,**中如果存在類似於下面的**就會出錯:

int num = 1.0;

double *p = (int *)(&num);

所以當優化級別在-o2及以上時,應該使用-fno-strict-aliasing關閉strict-aliasing。如果可以確保**中不存在類似於上述的**,那就不要關閉。據mysql的worklog描述,**優化速度還是很可觀的。

-fpic和-shared

編譯動態庫時常用的兩個選項。fpic告訴編譯器編譯與位址無關的**(position independent code)。**中涉及到的位址都是相對位址,絕對位址執行時通過got計算得到。-shared告訴編譯器編譯的是乙個動態庫。如果沒有-shared,編譯器會以找不到main函式而失敗返回。

-wl,-rpath=...

如果乙份**使用了自己編寫的動態庫,而且沒有放在執行時查詢動態庫的預設路徑中。在這台機器上編譯,換個目錄執行,就會報找不到動態庫的錯誤。編譯時使用的-l選項只是在程式鏈結成可執行檔案時候用的,程式啟動時候仍然會發生找不到庫的情況。如果編譯的時候這樣: -wl, -rpath=path_of_lib(絕對路徑), 那麼在程式執行的時候,就不會出現動態庫明明存在,但是找不到的情況了。

使用GCC和G 編譯

1 編譯c檔案 main.c檔案內容如下 include int main printf hello world return 0 然後進行編譯 gcc o 目標名 c語言檔名如 deepfuture deepfuture desktop gcc o dp main.c deepfuture dee...

gcc常用編譯引數說明

gcc編譯引數 g 為了gdb除錯使用,預設加上有利於後期直接定位coredump o2 優化選項 o0 o1 o2 o3 o0 不進行優化處理。o 或 o1 優化生成 o2 進一步優化。o3 比 o2 更進一步優化,包括 inline 函式 pipe 使用管道代替編譯中臨時檔案,加速編譯 wall...

gcc編譯器常用引數

gcc fly.c o flygcc g fly.c o flygcc fly.c o fly dopen printf debug or d open printf debug 注 dname 定義巨集name,預設定義內容為字串 1 dname value 定義巨集name,並且內容為value...