C C 之Gcc常用引數

2021-08-15 16:14:09 字數 4091 閱讀 4846

gcc是gnu旗艦產品,目前基本上就是和unix**在一起分發的。這個東西功能強大,有多達上千個選項,其使用者手冊也有將近一萬行。雖然其中的多數選項平時很少用到,但是不管裝軟體還是寫程式,往往都會用到gcc。下面我就gcc最最常用的幾個選項做乙個簡要的說明。

gcc指令的一般格式為:gcc [選項] 要編譯的檔案 [選項] [目標檔案]

gcc [-c|-s|-e] [-std=standard]

[-g] [-pg] [-olevel]

[-wwarn...] [-pedantic]

[-idir...] [-ldir...]

[-dmacro[=defn]...] [-umacro]

[-foption...] [-mmachine-option...]

[-o outfile] infile...

-c 編譯為目標檔案,不連線庫

-s 編譯為彙編**

-e 預處理。預處理之後的**將送往標準輸出

-wwarn... 設定警告,可以設定的警告開關很多,通常用-wall開啟所有的警告

-olevel 設定優化級別,level可以是0、1、2、3或者s,預設-o0,即不進行優化。

-dname=definition... 在命令列上定義巨集,有兩種方式,-dname或者-dname=definition。在命令列上設定巨集定義的目的主要是為了在除錯的時候設定一些開關,而在發布的時候再關閉或者開啟這些開關即可,當然巨集定義也用來對**進行有選擇地編譯。另外也還有其他的一些作用.

-uname 取消巨集定義name,作用和上面的正好相反.

-idir... 把dir加到頭檔案的搜尋路徑中,而且gcc會在搜尋標準標頭檔案之前先搜尋dir

-llibrary 在連線的時候搜尋library庫,庫是一些archieve檔案--其成員是目標檔案.如果有檔案引用library,library在命令列的位置應該在那個檔案之後。因此,越底層的庫越要放在後面。比如如果你要連線pcap庫,那麼你就需要使用-lpcap對原始檔進行編譯。

-ldir... 把dir加到庫檔案的搜尋路徑中,而且gcc會在搜尋標準庫檔案之前先搜尋dir

-pthread 通過pthreads庫加入對多執行緒的支援,這為預處理和連線設定了標誌。pthread是posix指定的標準執行緒庫。

-std=standard 設定採用的標準。該選項是針對c語言的,比如-std=c99表示編譯器遵循c99標準.該選項較少使用。

-o outfile 指定輸出檔案的檔名,預設為a.out

-mmachine-option... 指定所用的平台。

linux下常見副檔名

1、沒有任何選項:gcc hello.c

結果會在與hello.c相同的目錄下產生乙個a.out的可執行檔案。

2、-o選項,指定輸出檔名:gcc -o hello hello.c

-o意思是output即需要指定輸出的可執行檔案的名稱。這裡的名稱為helloworld。

3、-c選項,只編譯,不彙編連線:gcc -c hello.c

-c意思就是compile,產生乙個叫hello.o的目標檔案

4、-s選項,產生彙編原始檔:gcc -s hello.c

-s意思就是assemble,產生乙個叫hello.s的彙編原始檔

5、-e選項,預處理c原始檔:gcc -e hello.c

-e意思就是preprocess。輸出不是送到乙個檔案而是標準輸出。當然可以對它進行重定向:gcc -e hello.c > helloworld.txt或者gcc –e hello.c –o hello.i

6.1、-o選項,基本優化:gcc -o hello.c

-o意思就是optimize,產生乙個經過優化的叫作a.out的可執行檔案。也可以同時使用-o選項,以指定輸出檔名。如:gcc -o -o test hello.c

6.2、-o2選項,最大優化:gcc -o2 hello.c

產生乙個經過最大優化的叫作a.out的可執行檔案。

7、-g選項,產生供gdb除錯用的可執行檔案:gcc -g helloworld.c

產生乙個叫作a.out的可執行檔案,大小明顯比只用-o選項編譯彙編連線後的檔案大。

8、-pg選項,產生供gprof剖析用的可執行檔案:gcc -pg helloworld.c

產生乙個叫作a.out的執行檔案,大小明顯比用-g選項後產生的檔案還大。

gcc編譯器的工作過程

gcc的編譯流程分為了4個步驟,分別為:

預處理:gcc -e hello.c -o hello.i

編譯:gcc -s hello.i -o hello.s

gcc 編譯階段首先要檢查**的規範性,是否有語法錯誤等。以確定**實際要做的工作,在檢查無誤後,gcc 把**翻譯成組合語言。使用者可以使用-s 選項進行檢視,該選項只進

彙編:gcc -c hello.s -o hello.o

gcc 彙編階段:生成目標** *.o ;有兩種方式:使用 gcc 直接從源**生成目標** gcc -c *.s -o *.o 以及使用彙編器從彙編**生成目標** as *.s -o *.o

也可以直接使用as *.s, 將執行彙編、鏈結過程生成可執行檔案a.out, 可以像上面使用-o 選項指定輸出檔案的格式。

gcc的錯誤型別及對策

gcc編譯器如果發現源程式中有錯誤,就無法繼續進行,也無法生成最終的可執行檔案。為了便於修改,gcc給出錯誤資訊,我們必須對這些錯誤資訊逐個進行分析、處理,並修改相應的語言,才能保證源**的正確編譯連線。gcc給出的錯誤資訊一般可以分為四大類,下面我們分別討論其產生的原因和對策。

第一類∶c語法錯誤

error∶檔案source.c中第n行有語法錯誤(syntex errror)。

這種型別的錯誤,一般都是c語言的語法錯誤,應該仔細檢查源**檔案中第n行及該行之前的程式,有時也需要對該檔案所包含的標頭檔案進行檢查。有些情況下,乙個很簡單的語法錯誤,gcc會給出一大堆錯誤。

第二類∶標頭檔案錯誤

error∶找不到標頭檔案head.h(can not find include file head.h)。

這類錯誤是源**檔案中的包含標頭檔案有問題,可能的原因有頭檔名錯誤、指定的標頭檔案所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。

第三類∶檔案庫錯誤

error∶連線程式找不到所需的函式庫,例如∶ ld: -lm: no such file or directory

這類錯誤是與目標檔案相連線的函式庫有錯誤,可能的原因是函式庫名錯誤、指定的函式庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應的函式庫名,確定檔案庫及目錄的名稱並修改程式中及編譯選項中的名稱。

第四類∶未定義符號

error∶有未定義的符號(undefined symbol)。

這類錯誤是在連線過程中出現的,可能有兩種原因∶一是使用者自己定義的函式或者全域性變數所在源**檔案,沒有被編譯、連線,或者乾脆還沒有定義,這需要使用者根據實際情況修改源程式,給出全域性變數或者函式的定義體;二是未定義的符號是乙個標準的庫函式,在源程式中使用了該庫函式,而連線過程中還沒有給定相應的函式庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護命令ar檢查我們需要的庫函式到底位於哪乙個函式庫中,確定之後,修改gcc連線選項中的-l和-l項。

gcc常用引數

gcc的一些重要引數 1.i 指定標頭檔案搜尋路徑 i 表include 如 gcc c hello.c o hello.o i usr include 2.l 指定要連線的庫所在的目錄 l 指定要連線的庫的名字 如 gcc main.o l usr lib lqt o hello 3.d 定義巨集...

gcc常用引數

今晚看了些有關gcc的編譯選項的內容,記錄下來以備查用。1 gcc c 只編譯不鏈結,生成.o檔案。例如,gcc c hello.c,將由hello.c得到hello.o 2 gcc o直接得到可執行檔案,並且可以指定可執行檔的名稱。例如,gcc o hello hello.c,將由hello.c得...

gcc常用引數

o file 指定輸出檔名,在編譯為目標 時,這一選項不是必須的。如果file沒有指定,預設檔名是a.out.c 只編譯不鏈結 dfoo bar 在命令列定義預處理巨集foo,其值為bar idirname 將dirname加入到頭檔案的搜尋目錄列表中 ldirname 將dirname加入到庫檔案...