GCC之旅(2)- 常用編譯選項詳解

參考http://www.cublog.cn/u3/109488/showart_2138960.html

常用編譯選項:

-o filename 把輸出文件輸出到 filename

-E只進行預編譯,不做其他處理

-S 只是編譯不彙編,生成彙編代碼

-c 只是編譯不鏈接,生成目標文件“.o”

-g 在可執行程序中包含標準調試信息,可以由GDB調用來調試

-v 打印出編譯器內部編譯各過程的命令行信息和編譯器的版本

-I dir 在頭文件的搜索路徑列表中添加 dir 目錄

-L dir 在庫文件的搜索路徑列表中添加 dir 目錄

-static 鏈接靜態庫

-lname通過這個參數連接名爲 libname.so 或者libname.a的庫文件

-Dmarco 在編譯時加入名爲marco的宏

 

GCC常用格式

gcc [參數選項] 編譯文件 [選項] [輸出文件]

 

-E: 只進行預編譯,不做其他處理

[root@localhost gccinfo]# gcc -E test.c -o test.i

 

-S: 只是編譯不彙編,生成彙編代碼

[root@localhost gccinfo]# gcc -S test.i -o test.s

 

-c:只是編譯不鏈接,生成目標文件“.o”

[root@localhost gccinfo]# gcc -c test.s -o test.o

 

-g:在可執行程序中包含標準調試信息,可以由GDB調用來調試。

[root@localhost gccinfo]# gcc -g test.c -o test

那麼可執行文件test將包含了標準的調試信息,可以由GDB調用來調試。

 

-v:打印出編譯器內部編譯各過程的命令行信息和編譯器的版本

[root@localhost gccinfo]# gcc -v test.c -o test

 

-I dir:在頭文件的搜索路徑列表中添加 dir 目錄

頭文件路徑:一般在編譯文件的當前目錄下尋找,如果沒有則在/usr/include/下尋找。

在當前目錄下查找的頭文件一般用雙引號引起,而用<>的頭文件則在默認目錄下查找。

  1 #include <stdio.h>     // 在標準路徑中查找

  2 #include "myfun.h"    // 在本文件當前目錄中查找,或者在-I指定的目錄中查找

  3 int main(void)

  4 {      

  5         printf("Hello World!/n");

  6         return 0;

  7 }

通過-I+路徑來指定,-I/usr/local/include/

[root@localhost gccinfo]# gcc test.c -I/usr/local/ -o test

 

-L dir: 在庫文件的搜索路徑列表中添加 dir 目錄

-lname: 通過這個參數連接名爲 libname.so 或者libname.a的庫文件。Linux下庫的命名有一個規定,則必須要用lib開頭,那麼-l選項後的參數name則是函數庫libxxxx去掉xxxx的名字,不包括後綴.so或者.a

函數庫路徑:一般在/usr/lib/, /lib/, /usr/local/lib下尋找。需要特別指定的可以用-L dir選項來制定路徑。

假設有個名爲libfoo.so文件在/tmp下,那麼編譯時應該:

[root@localhost gccinfo]# gcc test.c -L/tmp -lfoo -o test

庫文件的後綴:.so 表示的動態庫文件; .a表示的是靜態庫文件。GCC在默認情況下優先選擇.so的動態庫文件來連接。意思是如果有兩個文件:libfoo.solibfoo.a/tmp目錄下,當執行下面命令時:

[root@localhost gccinfo]# gcc test.c -L/tmp -lfoo -o test

編譯器會自動連接libfoo.so這個文件。

 

-Dmarco:在編譯時加入名爲marco的宏

以文件ma.c來說明:

  1 #include <stdio.h>

  2

  3 int main(void)

  4 {

  5         #ifdef __DEBUG__

  6         printf("DEBUG/n");

  7         #endif

  8         printf("Hello World!/n");

  9         return 0;

 10 }

首先執行下面命令並觀察結果:

[root@localhost gccinfo]# gcc ma.c -o ma

[root@localhost gccinfo]# ./ma

Hello World!

在觀察帶有-D選項的編譯結果:

[root@localhost gccinfo]# gcc -D__DEBUG__ ma.c -o ma

[root@localhost gccinfo]# ./ma

DEBUG

Hello World!

對比可以知道-Dmarco相當於在編譯的源文件中加上了一句#define marco

 

 

告警和出錯選項:

-ansi 支持符合 ANSI 標準的 C 程序

-pedantic 允許發出 ANSI C 標準所列的全部警告信息

-pedantic-error 允許發出 ANSI C 標準所列的全部錯誤信息

-w 閉所有告警

-Wall 允許發出 Gcc 提供的所有有用的報警信息

-werror 把所有的告警信息轉化爲錯誤信息,並在告警發生時終止編譯過程

 

現在已文件warning.c來說明

  1 #include <stdio.h>

  2 void main(void)

  3 {

  4         long long a=1;

  5         return 0;

  6 }

 

-ansi:該選項強制 GCC 生成標準語法所要求的告警信息,儘管這還並不能保證所有沒有警告的程序都是符合 ANSI C 標準的。運行結果如下所示:

[root@localhost gccinfo]# gcc -ansi warning.c -o waring

warning.c: In function `main':

warning.c:5: warning: `return' with a value, in function returning void

warning.c:3: warning: return type of `main' is not `int'

可以看出,該選項並沒有發現“long long”這個無效數據類型的錯誤。

 

-pedantic:允許發出 ANSI C 標準所列的全部警告信息,同樣也保證所有沒有警告的程序都是符合ANSI C 標準的。其運行結果如下所示:

[root@localhost gccinfo]# gcc -pedantic warning.c -o waring

warning.c: In function `main':

warning.c:4: warning: ISO C90 does not support `long long'

warning.c:5: warning: `return' with a value, in function returning void

warning.c:3: warning: return type of `main' is not `int'

可以看出,使用該選項查看出了“long long”這個無效數據類型的錯誤。

 

-Wall 允許發出 Gcc 提供的所有有用的報警信息

[root@localhost gccinfo]# gcc -Wall warning.c -o waring

warning.c:2: warning: return type of `main' is not `int'

warning.c: In function `main':

warning.c:5: warning: `return' with a value, in function returning void

warning.c:4: warning: unused variable `a'

 

GCC編譯器優化選項:

GCC 可以對代碼進行優化,它通過編譯選項“-On”來控制優化代碼的生成,其中 n 是一個代表優化級別的整數。對於不同版本的 Gcc 來講,n 的取值範圍及其對應的優化效果可能並不完全相同,比較典型的範圍是從 0 變化到 2 3。不同的優化級別對應不同的優化處理工作。如使用優化選項“-O”主要進行線程跳轉(Thread Jump)延遲退棧(Deferred Stack Pops)兩種優化。使用優化選項“-O2”除了完成所有“-O1”級別的優化之外,同時還要進行一些額外的調整工作,如處理器指令調度等。選項“-O3”則還包括循環展開和其他一些與處理器特性相關的優化工作。雖然優化選項可以加速代碼的運行速度,但對於調試而言將是一個很大的挑戰。因爲代碼在經過優化之後,原先在源程序中聲明和使用的變量很可能不再使用,控制流也可能會突然跳轉到意外的地方,循環語句也有可能因爲循環展開而變得到處都有,所有這些對調試來講都將是一場噩夢。所以筆者建議在調試的時候最好不使用任何優化選項,只有當程序在最終發行的時候才考慮對其進行優化。

 

GCC體系結構相關選項:

-mcpu=type 針對不同的 CPU 使用相應的 CPU 指令。可選擇的 type i386i486pentium i686

-mieee-fp 使用 IEEE 標準進行浮點數的比較

-mno-ieee-fp 不使用 IEEE 標準進行浮點數的比較

-msoft-float 輸出包含浮點庫調用的目標代碼

-mshort int 類型作爲 16 位處理,相當於 short int

-mrtd 強行將函數參數個數固定的函數用 ret NUM 返回,節省調用函數的一條指令

 

 

 

發佈了26 篇原創文章 · 獲贊 9 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章