日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc及其选项详解

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc及其选项详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
gcc及其選項詳解 2009-12-06 20:45:25

分類: LINUX

1.簡介:

gccgnu旗艦產(chǎn)品,目前基本上就是和unix捆綁在一起分發(fā)的。這個東西功能強大,但是有多達(dá)上千個選項,其用戶手冊也有將近一萬行.雖然其中的多數(shù)選項平時很少用到.但是不管裝軟件還是寫程序,往往都會用到gcc.下面我就gcc最最常用的幾個選項做一個簡要的說明,如果你想對gcc有一個全面的了解,比如你想知道在其他非x86平臺上gcc是如何工作的話,你可以用命令:man gcc;

gcc???? [-c|-S|-E] [-std=standard]

????????? [-g] [-pg] [-Olevel]

????????? [-Wwarn...] [-pedantic]

????????? [-Idir...] [-Ldir...]

????????? [-Dmacro[=defn]...] [-Umacro]

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

????????? [-o outfile] infile...

-c???????????????? 編譯為目標(biāo)文件,不連接庫

-S???????????????? 編譯為匯編代碼

-E??? ?????????????預(yù)處理.預(yù)處理之后的代碼將送往標(biāo)準(zhǔn)輸出

-Wwarn... 設(shè)置警告,可以設(shè)置的警告開關(guān)很多,通常用-Wall開啟所有的警告

-Olevel?? 設(shè)置優(yōu)化級別,level可以是0,1,2,3或者s,默認(rèn)-O0,即不進(jìn)行優(yōu)化。.

-Dname=definition... 在命令行上定義宏,有兩種方式,-Dname或者-Dname=definition.在命令行上設(shè)置宏定義的目的主要是為了在調(diào)試的時候設(shè)定一些開關(guān), 而在發(fā)布的時候再關(guān)閉或者打開這些開關(guān)即可,當(dāng)然宏定義也用來對代碼進(jìn)行有選擇地編譯.另外也還有其他的一些作用.

-Uname?????? 取消宏定義name,作用和上面的正好相反.

-Idir...??????? dir加到頭文件的搜索路徑中,而且gcc會在搜索標(biāo)準(zhǔn)頭文件之前先搜索dir.

-llibrary????? 在連接的時候搜索library庫,庫是一些archieve文件--其成員是目標(biāo)文件.如果有文件引用library,library在命令行的位置應(yīng)該在那個文件之后,因此,越底層的庫越要放在后面.比如如果你要連接pcap,那么你就需要使用-lpcap對源文件進(jìn)行編譯.

-Ldir...??????? dir加到庫文件的搜索路徑中,而且gcc會在搜索標(biāo)準(zhǔn)庫文件之前先搜索dir.

-pthread?????? 通過pthreads庫加入對多線程的支持,這為預(yù)處理和連接設(shè)置了標(biāo)志.pthreadPOSIX指定的標(biāo)準(zhǔn)線程庫.

-std=standard?? 設(shè)置采用的標(biāo)準(zhǔn),該選項是針對C語言的,比如-std=c99表示編譯器遵循C99標(biāo)準(zhǔn).該選項較少使用.而且有時反而會把你搞糊涂.

-o outfile?????? 指定輸出文件的文件名,默認(rèn)為a.out

-mmachine-option...?? 指定所用的平臺.

?

---------------------------------------------------------------------------------------

2.gcc常用選項總結(jié)

2.1 常規(guī)選項

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

結(jié)果會在與helloworld.c相同的目錄下產(chǎn)生一個a.out的可執(zhí)行文件。

2-o選項,指定輸出文件名:gcc -o helloworld helloworld.c

-o意思是Output即需要指定輸出的可執(zhí)行文件的名稱。這里的名稱為helloworld

3-c選項,只編譯,不匯編連接:gcc -c helloworld.c

-c意思就是Compile,產(chǎn)生一個叫helloworld.o的目標(biāo)文件

4-S選項,產(chǎn)生匯編源文件:gcc -S helloworld.c

-S意思就是aSsemble,產(chǎn)生一個叫helloworld.s的匯編源文件

5-E選項,預(yù)處理C源文件:gcc -E helloworld.c

-E意思就是prEprocess。輸出不是送到一個文件而是標(biāo)準(zhǔn)輸出。當(dāng)然可以對它進(jìn)行重定向:

gcc -E helloworld.c > helloworld.txt

2.2 優(yōu)化選項

1) -O選項,基本優(yōu)化:gcc -O helloworld.c

-O意思就是Optimize,產(chǎn)生一個經(jīng)過優(yōu)化的叫作a.out的可執(zhí)行文件。也可以同時使用-o選項,以指定輸出文件名。如:

gcc -O -o test helloworld.c

即會產(chǎn)生一個叫test的經(jīng)過優(yōu)化的可執(zhí)行文件。

2) -O2選項,最大優(yōu)化:gcc -O2 helloworld.c

產(chǎn)生一個經(jīng)過最大優(yōu)化的叫作a.out的可執(zhí)行文件。

2.3 調(diào)試選項

1) -g選項,產(chǎn)生供gdb調(diào)試用的可執(zhí)行文件:gcc -g helloworld.c

產(chǎn)生一個叫作a.out的可執(zhí)行文件,大小明顯比只用-o選項編譯匯編連接后的文件大。

2) -pg選項,產(chǎn)生供gprof剖析用的可執(zhí)行文件:gcc -pg helloworld.c

產(chǎn)生一個叫作a.out的執(zhí)行文件,大小明顯比用-g選項后產(chǎn)生的文件還大。

?

?

------------------------------------------------------------------------------------

3. Gcc的錯誤類型及對策

?Gcc編譯器如果發(fā)現(xiàn)源程序中有錯誤,就無法繼續(xù)進(jìn)行,也無法生成最終的可執(zhí)行文件。為了便于修改,gcc給出錯誤資訊,我們必須對這些錯誤資訊逐個進(jìn)行分析、處理,并修改相應(yīng)的語言,才能保證源代碼的正確編譯連接。gcc給出的錯誤資訊一般可以分為四大類,下面我們分別討論其產(chǎn)生的原因和對策。

第一類∶C語法錯誤

錯誤資訊∶文件source.c中第n行有語法錯誤(syntex errror)這種類型的錯誤,一般都是C語言的語法錯誤,應(yīng)該仔細(xì)檢查源代碼文件中第n行及該行之前的程序,有時也需要對該文件所包含的頭文件進(jìn)行檢查。有些情況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,我們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。

第二類∶頭文件錯誤

錯誤資訊∶找不到頭文件head.h(Can not find include file head.h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。

第三類∶檔案庫錯誤

錯誤資訊∶連接程序找不到所需的函數(shù)庫,例如∶

ld: -lm: No such file or directory

這類錯誤是與目標(biāo)文件相連接的函數(shù)庫有錯誤,可能的原因是函數(shù)庫名錯誤、指定的函數(shù)庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應(yīng)的函數(shù)庫名,確定檔案庫及目錄的名稱并修改程序中及編譯選項中的名稱。

第四類∶未定義符號

錯誤資訊∶有未定義的符號(Undefined symbol)。這類錯誤是在連接過程中出現(xiàn)的,可能有兩種原因∶一是使用者自己定義的函數(shù)或者全局變量所在源代碼文件,沒有被編譯、連接,或者干脆還沒有定義,這需要使用者根據(jù)實際情況修改源程序,給出全局變量或者函數(shù)的定義體;二是未定義的符號是一個標(biāo)準(zhǔn)的庫函數(shù),在源程序中使用了該庫函數(shù),而連接過程中還沒有給定相應(yīng)的函數(shù)庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護(hù)命令ar檢查我們需要的庫函數(shù)到底位于哪一個函數(shù)庫中,確定之后,修改gcc連接選項中的-l-L項。

排除編譯、連接過程中的錯誤,應(yīng)該說這只是程序設(shè)計中最簡單、最基本的一個步驟,可以說只是開了個頭。這個過程中的錯誤,只是我們在使用 C語言描述一個算法中所產(chǎn)生的錯誤,是比較容易排除的。我們寫一個程序,到編譯、連接通過為止,應(yīng)該說剛剛開始,程序在運行過程中所出現(xiàn)的問題,是算法設(shè)計有問題,說得更玄點是對問題的認(rèn)識和理解不夠,還需要更加深入地測試、調(diào)試和修改。一個程序,稍為復(fù)雜的程序,往往要經(jīng)過多次的編譯、連接和測試、修改。

總結(jié)

以上是生活随笔為你收集整理的gcc及其选项详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。