GCC編譯器用法常見錯誤及過程 介紹

2021-10-08 06:47:22 字數 2305 閱讀 7525

1、gcc最基本的用法是∶gcc[options] [filenames] 其中options就是編譯器所需要的引數,filenames給出相關的檔名稱。

-c,只編譯,不連線成為可執行檔案,編譯器只是由輸入的.c等源**檔案生成.o為字尾的目標檔案,通常用於編譯不包含主程式的子程式檔案。

-ooutput_filename,確定輸出檔案的名稱為output_filename,同時這個名稱不能和原始檔同名。如果不給出這個選項,gcc就給出缺省的可執行檔案a.out。 eg: gcc -o test test.c 然後執行生成的檔案 ./test,即執行了生成的可執行檔案。

-g,產生符號除錯工具(gnu的gdb)所必要的符號資訊,要想對源**進行除錯,我們就必須加入這個選項。

-o,對程式進行優化編譯、連線,採用這個選項,整個源**會在編譯、連線過程中進行優化處理,這樣產生的可執行檔案的執行效率可以提高,但是,編譯、連線的速度就相應地要慢一些。

-o2,比-o更好的優化編譯、連線,當然整個編譯、連線過程會更慢。

-i dirname,將dirname所指出的目錄加入到程式頭檔案目錄列表中,是在預編譯過程中使用的引數。

-l dirname,將dirname所指出的目錄加入到程式函式檔案庫檔案的目錄列表中,是在連線過程中使用的引數。

2、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 項。

3、gcc編譯過程

預處理》編譯》彙編》連線。

第一步預處理

gcc -e hello.c -o hello.i

預編主要前面處理帶「#」的指令,如#include、#define等,還要刪除注釋,新增行號和檔名標識。

第二步編譯

gcc -s hello.i -o hello.s

編譯過程是把預處理完的檔案進行一系列的詞法分析、語法分析、語義分析及優化後生產相應的彙編**檔案。

第三步彙編

gcc -c hello.s -o hello.o

將**轉換成機器可以執行的指令。

第四步連線

連線是乙個複雜的過程,使用ld指令

ld -static crt1.o crti.o crtbegint.o hello.o -start -group -lgcc -lgcc_eh -lc -end-group crtend.o crtn.o 

連線的過程包括按序疊加、相似段合併、符號位址的確定、符號解析與重定位、指令修正、全域性構造與解析等等。

GCC編譯過程及基本用法

gcc是有gnu開發的程式語言編譯器。使用gcc編譯器,目的大多都是將源 編譯成可執行檔案。但是在這看似簡單的一步,實則經過了預處理 preprocessing 編譯 compilation 彙編 assembly 和鏈結 linking 四個步驟 步驟命令引數 預處理 e 編譯 s 彙編 c 1 ...

常見gcc編譯錯誤

wtype limits 出現 if p null 情況本應該是if p null 但是編譯器只會給出警告,而不是直接報錯,可以採用if null p 避免 unsigned char i for i 0 i 255 i 大部分只會給出警告 wreorder 定義變數和初始化變數順序不一致 wign...

gcc簡介及編譯過程

1 編譯器 gcc 簡介 linux系統下的 gcc gnu c compiler 是gnu推出的功能強大 效能優越的多 平台編譯器,它是gnu的代表作品之一,gcc是可以在多種硬體平台上編譯出可 執行檔案的超級編譯器,其執行效率比一般的編譯器要高出20 30 編譯器能 將c c 語言源程式 組合語...