1.簡介:
html
gcc是gnu旗艦產品,目前基本上就是和unix捆綁在一塊兒分發的。這個東西功能強大,可是有多達上千個選項,其用戶手冊也有將近一萬行.雖然其中的多數選項平時不多用到.可是無論裝軟件仍是寫程序,每每都會用到gcc.下面我就gcc最最經常使用的幾個選項作一個簡要的說明,若是你想對gcc有一個全面的瞭解,好比你想知道在其餘非x86平臺上gcc是如何工做的話,你能夠用命令:man gcc;算法
gcc [-c|-S|-E] [-std=standard]多線程
[-g] [-pg] [-Olevel]函數
[-Wwarn...] [-pedantic]測試
[-Idir...] [-Ldir...]優化
[-Dmacro[=defn]...] [-Umacro]ui
[-foption...] [-mmachine-option...]spa
[-o outfile] infile....net
-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庫加入對多線程的支持,這爲預處理和鏈接設置了標誌NaNhread是POSIX指定的標準線程庫.
-std=standard 設置採用的標準,該選項是針對C語言的,好比-std=c99表示編譯器遵循C99標準.該選項較少使用.並且有時反而會把你搞糊塗.
-o outfile 指定輸出文件的文件名,默認爲a.out
-mmachine-option... 指定所用的平臺.
---------------------------------------------------------------------------------------
2.gcc經常使用選項總結
2.1 常規選項
1、沒有任何選項:gcc helloworld.c
結果會在與helloworld.c相同的目錄下產生一個a.out的可執行文件。
2、-o選項,指定輸出文件名:gcc -o helloworld helloworld.c
-o意思是Output即須要指定輸出的可執行文件的名稱。這裏的名稱爲helloworld。
3、-c選項,只編譯,不彙編鏈接:gcc -c helloworld.c
-c意思就是Compile,產生一個叫helloworld.o的目標文件
4、-S選項,產生彙編源文件:gcc -S helloworld.c
-S意思就是aSsemble,產生一個叫helloworld.s的彙編源文件
5、-E選項,預處理C源文件:gcc -E helloworld.c
-E意思就是prEprocess。輸出不是送到一個文件而是標準輸出。固然能夠對它進行重定向:
gcc -E helloworld.c > helloworld.txt
2.2 優化選項
1) -O選項,基本優化:gcc -O helloworld.c
-O意思就是Optimize,產生一個通過優化的叫做a.out的可執行文件。也能夠同時使用-o選項,以指定輸出文件名。如:
gcc -O -o test helloworld.c
即會產生一個叫test的通過優化的可執行文件。
2) -O2選項,最大優化:gcc -O2 helloworld.c
產生一個通過最大優化的叫做a.out的可執行文件。
2.3 調試選項
1) -g選項,產生供gdb調試用的可執行文件:gcc -g helloworld.c
產生一個叫做a.out的可執行文件,大小明顯比只用-o選項編譯彙編鏈接後的文件大。
2) -pg選項,產生供gprof剖析用的可執行文件:gcc -pg helloworld.c
產生一個叫做a.out的執行文件,大小明顯比用-g選項後產生的文件還大。
------------------------------------------------------------------------------------
3. Gcc的錯誤類型及對策
Gcc編譯器若是發現源程序中有錯誤,就沒法繼續進行,也沒法生成最終的可執行文件。爲了便於修改,gcc給出錯誤資訊,咱們必須對這些錯誤資訊逐個進行分析、處理,並修改相應的語言,才能保證源代碼的正確編譯鏈接。gcc給出的錯誤資訊通常能夠分爲四大類,下面咱們分別討論其產生的緣由和對策。
第一類∶C語法錯誤
錯誤資訊∶文件source.c中第n行有語法錯誤(syntex errror)。這種類型的錯誤,通常都是C語言的語法錯誤,應該仔細檢查源代碼文件中第n行及該行以前的程序,有時也須要對該文件所包含的頭文件進行檢查。有些狀況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,咱們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。
第二類∶頭文件錯誤
錯誤資訊∶找不到頭文件head.h(Can not find include file head.h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的緣由有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也多是錯誤地使用了雙引號和尖括號。
第三類∶檔案庫錯誤
錯誤資訊∶鏈接程序找不到所需的函數庫,例如∶
ld: -lm: No such file or directory
這類錯誤是與目標文件相鏈接的函數庫有錯誤,可能的緣由是函數庫名錯誤、指定的函數庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應的函數庫名,肯定檔案庫及目錄的名稱並修改程序中及編譯選項中的名稱。
第四類∶未定義符號
錯誤資訊∶有未定義的符號(Undefined symbol)。這類錯誤是在鏈接過程當中出現的,可能有兩種緣由∶一是使用者本身定義的函數或者全局變量所在源代碼文件,沒有被編譯、鏈接,或者乾脆尚未定義,這須要使用者根據實際狀況修改源程序,給出全局變量或者函數的定義體;二是未定義的符號是一個標準的庫函數,在源程序中使用了該庫函數,而鏈接過程當中尚未給定相應的函數庫的名稱,或者是該檔案庫的目錄名稱有問題,這時須要使用檔案庫維護命令ar檢查咱們須要的庫函數到底位於哪個函數庫中,肯定以後,修改gcc鏈接選項中的-l和-L項。
排除編譯、鏈接過程當中的錯誤,應該說這只是程序設計中最簡單、最基本的一個步驟,能夠說只是開了個頭。這個過程當中的錯誤,只是咱們在使用C語言描述一個算法中所產生的錯誤,是比較容易排除的。咱們寫一個程序,到編譯、鏈接經過爲止,應該說剛剛開始,程序在運行過程當中所出現的問題,是算法設計有問題,說得更玄點是對問題的認識和理解不夠,還須要更加深刻地測試、調試和修改。一個程序,稍爲複雜的程序,每每要通過屢次的編譯、鏈接和測試、修改。