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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++之Gcc常用参数

發(fā)布時(shí)間:2024/10/14 c/c++ 99 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++之Gcc常用参数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

gcc是GNU旗艦產(chǎn)品,目前基本上就是和Unix捆綁在一起分發(fā)的。這個(gè)東西功能強(qiáng)大,有多達(dá)上千個(gè)選項(xiàng),其用戶手冊也有將近一萬行。雖然其中的多數(shù)選項(xiàng)平時(shí)很少用到,但是不管裝軟件還是寫程序,往往都會(huì)用到gcc。下面我就gcc最最常用的幾個(gè)選項(xiàng)做一個(gè)簡要的說明。

Gcc指令的一般格式為:Gcc [選項(xiàng)] 要編譯的文件 [選項(xiàng)] [目標(biāo)文件]

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í)候設(shè)定一些開關(guān),而在發(fā)布的時(shí)候再關(guān)閉或者打開這些開關(guān)即可,當(dāng)然宏定義也用來對代碼進(jìn)行有選擇地編譯。另外也還有其他的一些作用.

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

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

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

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

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

-std=standard 設(shè)置采用的標(biāo)準(zhǔn)。該選項(xiàng)是針對C語言的,比如-std=c99表示編譯器遵循C99標(biāo)準(zhǔn).該選項(xiàng)較少使用。

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

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

Linux下常見文件擴(kuò)展名

1、沒有任何選項(xiàng):gcc hello.c

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

2、-o選項(xiàng),指定輸出文件名:gcc -o hello hello.c

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

3、-c選項(xiàng),只編譯,不匯編連接:gcc -c hello.c

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

4、-S選項(xiàng),產(chǎn)生匯編源文件:gcc -S hello.c

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

5、-E選項(xiàng),預(yù)處理C源文件:gcc -E hello.c

-E意思就是prEprocess。輸出不是送到一個(gè)文件而是標(biāo)準(zhǔn)輸出。當(dāng)然可以對它進(jìn)行重定向:gcc -E hello.c > helloworld.txt或者gcc –E hello.c –o hello.i

6.1、-O選項(xiàng),基本優(yōu)化:gcc -O hello.c

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

6.2、-O2選項(xiàng),最大優(yōu)化:gcc -O2 hello.c

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

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

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

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

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

gcc編譯器的工作過程

Gcc的編譯流程分為了4個(gè)步驟,分別為:

  • 預(yù)處理(Pre-Processing)
  • 編譯(Compiling)
  • 匯編(Assembling)
  • 鏈接(Linking)。

預(yù)處理:gcc -E hello.c -o hello.i

?

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

gcc 編譯階段首先要檢查代碼的規(guī)范性,是否有語法錯(cuò)誤等。以確定代碼實(shí)際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。用戶可以使用-S 選項(xiàng)進(jìn)行查看,該選項(xiàng)只進(jìn)

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

gcc 匯編階段:生成目標(biāo)代碼 *.o ;有兩種方式:使用 gcc 直接從源代碼生成目標(biāo)代碼 gcc -c *.s -o *.o 以及使用匯編器從匯編代碼生成目標(biāo)代碼 as *.s -o *.o

鏈接:gcc hello.o -o hello

gcc 鏈接階段:生成可執(zhí)行文件

也可以直接使用as *.s, 將執(zhí)行匯編、鏈接過程生成可執(zhí)行文件a.out, 可以像上面使用-o 選項(xiàng)指定輸出文件的格式。

?

Gcc的錯(cuò)誤類型及對策

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

第一類∶C語法錯(cuò)誤

error∶文件source.c中第n行有語法錯(cuò)誤(syntex errror)。

這種類型的錯(cuò)誤,一般都是C語言的語法錯(cuò)誤,應(yīng)該仔細(xì)檢查源代碼文件中第n行及該行之前的程序,有時(shí)也需要對該文件所包含的頭文件進(jìn)行檢查。有些情況下,一個(gè)很簡單的語法錯(cuò)誤,gcc會(huì)給出一大堆錯(cuò)誤。

第二類∶頭文件錯(cuò)誤

error∶找不到頭文件head.h(Can not find include file head.h)。

這類錯(cuò)誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯(cuò)誤、指定的頭文件所在目錄名錯(cuò)誤等,也可能是錯(cuò)誤地使用了雙引號和尖括號。

第三類∶檔案庫錯(cuò)誤

error∶連接程序找不到所需的函數(shù)庫,例如∶ ld: -lm: No such file or directory

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

第四類∶未定義符號

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

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

?

總結(jié)

以上是生活随笔為你收集整理的C/C++之Gcc常用参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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