C語言基礎 GCC編譯器

2021-10-13 11:44:34 字數 3148 閱讀 7317

預處理(pre-processing)

編譯(compiling)

彙編(assembling)

鏈結(linking)

編譯器通過程式的副檔名來分辯編寫源程式所用的語言。由於不同的程式所需要執行編譯的步驟是不同的,因此gcc根據不同的字尾名對它們進行相應處理。

後 綴 名

所對應的語言

編 譯 流 程

.cc 原始程式

預處理、編譯、彙編

.c/.cc/.cxx

c++原始程式

預處理、編譯、彙編

.mobjective c 原始程式

預處理、編譯、彙編

.i已經過預處理的c 原始程式

編譯、彙編

.ii已經過預處理的c++原始程式

編譯、彙編

.s/.s

組合語言原始程式

彙編.h

預處理檔案(標頭檔案)

(不常出現在指令行)

.o目標檔案

鏈結.a/.so

編譯後的庫檔案

鏈結gcc基本語法

gcc [option | filename]
這裡的 option 是 gcc 使用時的一些選項,通過指定不同的選項 gcc 可以實現強大的功能。這裡的 filename 則是 gcc 要編譯的檔案,gcc 會根據使用者所指定的編譯選項以及所識別的檔案字尾名來對編譯檔案進行相應的處理。

預處理階段

gcc 的選項「-e」可以使編譯器在預處理結束時就停止編譯,選項「-o」是指定 gcc 輸出的結果,其命令格式如下:

gcc –e –o [目標檔案]

[編譯檔案]

例如: gcc –e –o hello.i hello.c

2.編譯階段

編譯器在預處理結束之後使用。gcc首先要檢查**的規範性、是否有語法錯誤等,以確定**實際要做的工作,在檢查無誤後,就開始把**翻譯成組合語言。gcc的選項「-s」能使編譯器在進行完編譯之後就停止。

gcc –s –o  [目標檔案] [編譯檔案]

例如: gcc –s –o hello.s hello.i

3.彙編階段 彙編階段是把編譯階段生成的「.s」檔案生成目標檔案,讀者在此使用選項「-c」就可看到彙編**已轉化為「.o」的二進位制目標**了。

gcc –c [目標檔案] [編譯檔案]

例如: gcc –c hello.s –o hello.o

gcc hello.o –o hello
gcc 的警告提示選項有很多種型別,主要可分為「-wall」類和非「-wall」類。

1.wall類警告提示

這一類警告提示選項佔了gcc警告選項的90%以上,它不僅包含開啟所有警告等功能,還可以單獨對常見錯誤分別指定警告。

選項作用

-wall

開啟所有型別語法警告,建議讀者養成使用該選項的習慣

-wchar-subscripts

如果陣列使用char 型別變數作為下標值的話,則發出警告。因為在某些平台上可能預設為 signed char,一旦溢位,就可能導致某些意外的結果

-wcomment

當「/」出現在「/ …… */」注釋中,或者「\」出現在「// ……」注釋結尾處時,使用-wcomment 會給出警告,它很可能會影響程式的執行結果

-wformat

檢查 printf 和 scanf 等格式化輸出輸入函式的格式字串與引數型別的匹配情況,如果發現不匹配則發出警告。某些時候格式字串與引數型別的不匹配會導致程式執行錯誤, 所以這是個很有用的警告選項

-wimplicit

該警告選項實際上是-wimplicit-int 和-wimplicit-function-declaration 兩個警告選項的集合。前者在宣告函式卻未指明函式返回型別時給出警告,後者則是在函式宣告前呼叫該函式時給出警告

-wmissing-braces

當聚合型別或者陣列變數的初始化表示式沒有充分用括號「{}」括起時,給出警告

-wparentheses

這是乙個很有用的警告選項,它能幫助使用者從那些看起來語法正確但卻由於操作符優先順序或者**結構「障眼」而導致錯誤執行的**中解脫出來

-wsequence-point

關於順序點(sequence point),在 c 標準中有解釋,不過很晦澀。我們在平時編碼中盡量避免寫出與實現相關、受實現影響的**便是了。而-wsequence-point 選項恰恰可以幫我們這個忙,它可以幫我們查出這樣的**來,並給出其警告

-wswitch

這個選項的功能淺顯易懂,通過文字描述也可以清晰地說明。當以乙個列舉型別(enum) 作為 switch 語句的索引但卻沒有處理 default 情況,或者沒有處理所有列舉型別定義範圍內的情況時,該選項會給出警告

-wunused-function

警告存在乙個未使用的static 函式的定義或者存在乙個只宣告卻未定義的static 函式

-wunused-label

用來警告存在乙個使用了卻未定義或者存在乙個定義了卻未使用的label

-wunused-variable

用來警告存在乙個定義了卻未使用的區域性變數或者非常量static 變數

-wunused-value

用來警告乙個顯式計算表示式的結果未被使用

-wunused-parameter

用來警告乙個函式的引數在函式的實現中並未被用到

-wuninitialized

該警告選項用於檢查乙個區域性自動變數在使用之前是否已經初始化或者在乙個 longjmp 呼叫可能修改乙個non-volatile automatic variable 時給出警告

這些警告提示可以根據自己的不同情況進行相應的選擇,這裡最為常用的是「-wall」。

2.非 wall 類警告提示

非 wall 類的警告提示中最為常用的有以下兩種:「-ansi」和「-pedantic」。

「-ansi」。該選項強制 gcc 生成標準語法所要求的告警資訊,儘管這還並不能保證所有沒有警告的程式都是符合ansi c 標準的。

「-pedantic」。該選項允許發出 ansi c 標準所列的全部警告資訊,同樣也保證所有沒有警告的程式都是符合 ansi c 標準的。

通過GCC編譯器編譯c語言

可以利用gcc的引數來控制執行的過程,這樣就可以更深入的了解編譯c程式的過程。下面將通過對乙個程式的編譯來演示整個過程。include int main 1 預處理 編譯器將c程式的標頭檔案編譯進來,還有巨集的替換,可以用gcc的引數 e來參看。作用 將hello.c預處理輸出hello.i 2 編...

C 語言編譯器 gcc 命令詳解

linux 系統中最重要的軟體開發工具是 gcc,在 linux 系統中,c89 cc 和 gcc 這些命令基本上都指向系統的c語言編譯器,通常是gnu c編譯器,或都簡稱 gcc。在 unix 系統中,c 語言編譯器稱為 cc。實際上,gcc 能夠編譯三種語言 c c 和 object c c 語...

gcc編譯器簡介

在linux中選擇gcc編譯器的原因是gcc執行效率高。gcc基本用法 gcc options filename 其中options為編譯選項。例子 執行指令 gcc hello.c 則對hello.c進行編譯,如果程式沒有語法錯誤,則產生可執行檔案a.out gcc預設檔名 執行可執行檔案指令 a...