Gcc編譯器如果發(fā)現(xiàn)源程序中有錯誤,就無法繼續(xù)進行,也無法生成最終的可執(zhí)行文件。為了便于修改,gcc給出錯誤資訊,我們必須對這些錯誤資訊逐個進行分析、處理,并修改相應(yīng)的語言,才能保證源代碼的正確編譯連接。gcc給出的錯誤資訊一般可以分為四大類,下面我們分別討論其產(chǎn)生的原因和對策。
1. 第一類∶C語法錯誤
錯誤資訊∶文件source.c中第n行有語法錯誤(syntex errror)。這種類型的錯誤,一般都是C語言的語法錯誤,應(yīng)該仔細檢查源代碼文件中第n行及該行之前的程序,有時也需要對該文件所包含的頭文件進行檢查。有些情況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,我們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。
2. 第二類∶頭文件錯誤
錯誤資訊∶找不到頭文件head.h(Can not find include file head.h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。
3. 第三類∶檔案庫錯誤
錯誤資訊∶連接程序找不到所需的函數(shù)庫,例如∶
ld: -lm: No such file or directory
這類錯誤是與目標文件相連接的函數(shù)庫有錯誤,可能的原因是函數(shù)庫名錯誤、指定的函數(shù)庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應(yīng)的函數(shù)庫名,確定檔案庫及目錄的名稱并修改程序中及編譯選項中的名稱。
4. 第四類∶未定義符號
錯誤資訊∶有未定義的符號(Undefined symbol)。這類錯誤是在連接過程中出現(xiàn)的,可能有兩種原因∶一是使用者自己定義的函數(shù)或者全局變量所在源代碼文件,沒有被編譯、連接,或者干脆還沒有定義,這需要使用者根據(jù)實際情況修改源程序,給出全局變量或者函數(shù)的定義體;二是未定義的符號是一個標準的庫函數(shù),在源程序中使用了該庫函數(shù),而連接過程中還沒有給定相應(yīng)的函數(shù)庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護命令ar檢查我們需要的庫函數(shù)到底位于哪一個函數(shù)庫中,確定之后,修改gcc連接選項中的-l和-L項。
排除編譯、連接過程中的錯誤,應(yīng)該說這只是程序設(shè)計中最簡單、最基本的一個步驟,可以說只是開了個頭。這個過程中的錯誤,只是我們在使用C語言描述一個算法中所產(chǎn)生的錯誤,是比較容易排除的。我們寫一個程序,到編譯、連接通過為止,應(yīng)該說剛剛開始,程序在運行過程中所出現(xiàn)的問題,是算法設(shè)計有問題,說得更玄點是對問題的認識和理解不夠,還需要更加深入地測試、調(diào)試和修改。一個程序,稍為復(fù)雜的程序,往往要經(jīng)過多次的編譯、連接和測試、修改。下面我們學(xué)習(xí)的程序維護、調(diào)試工具和版本維護就是在程序調(diào)試、測試過程中使用的,用來解決調(diào)測階段所出現(xiàn)的問題。