C程式編譯過程

2021-08-14 18:41:29 字數 2078 閱讀 2723

c語言一般用gcc進行編譯,下面乙個程式helloword.c:

#include#define buf_size 30

int main()

用gcc來生成可執行程式,命令為gcc helloword.c -o helloword,helloworld是可執行檔案。

其中過程一般包括以下4個步驟:

-預處理

-編譯-彙編

-鏈結gcc的選項有

-o 輸出可執行檔案

-c 編譯生成目標檔案

-g 輸出除錯資訊

-o2 編譯器優化級別  1-3

-wall 警告選項 輸出警告資訊

-l 緊接著鏈結庫 lpthread

-l 指定鏈結庫的路徑

-i 標頭檔案路徑

-shared 編譯成動態鏈結庫

1.預處理

主要包括以下過程:

-將#define刪除,並展開所有的定義

-處理所有的條件預編譯指令,比如#ifdef,#endif等

-處理#include預編譯指令,將被包含的檔案插入到該預編譯指令的位置

-刪除所有的注釋

-新增行號和檔案標識,以編譯時產生除錯用的行號及編譯錯誤警告行號

-保留所有的#pragma編譯器指令,編譯器需要使用它們

通常使用以下命令預處理

gcc -e helloworld.c -o helloworld.i

引數-e表示只進行預處理

也可以使用以下指令完成預處理過程

cpp helloworld.c > helloworld.i

用cat helloworld.i可以看到預處理後的**

2.編譯

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

$gcc -s helloworld.c -o helloworld.s

3.彙編

彙編器將彙編**轉變成機器可以執行的命令,每乙個彙編語句幾乎都對應一條機器指令。彙編相對於編譯過程比較簡單,根據彙編指令和機器執行的對照表翻譯即可。

$ gcc -c helloworld.c -o helloworld.o

注意helloworld.o檔案內容為機器碼。

4.鏈結

通過呼叫鏈結器ld來鏈結程式執行需要的一大堆目標檔案,以及所依賴的其它庫檔案,最後生成可執行檔案

總結

編譯過程可分為6步:掃瞄(詞法分析)、語法分析、語義分析、源**優化、**生成、目標**優化。

詞法分析:掃瞄器(scanner)將源代的字串行分割成一系列的記號(token)。lex工具可實現詞法掃瞄。

語法分析:語法分析器將記號(token)產生語法樹(syntax tree)。yacc工具可實現語法分析(yacc: yet another compiler compiler)。

語義分析:靜態語義(在編譯器可以確定的語義)、動態語義(只能在執行期才能確定的語義)。

源**優化:源**優化器(source code optimizer),將整個語法書轉化為中間**(intermediate code)(中間**是與目標機器和執行環境無關的)。中間**使得編譯器被分為前端和後端。編譯器前端負責產生機器無關的中間**;編譯器後端將中間**轉化為目標機器**。

目標**生成:**生成器(code generator).

目標**優化:目標**優化器(target code optimizer)。

鏈結的主要內容是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確地銜接。

鏈結的主要過程包括:位址和空間分配(address and storage allocation),符號決議(symbol resolution),重定位(relocation)等。

鏈結分為靜態鏈結和動態鏈結。

靜態鏈結是指在編譯階段直接把靜態庫加入到可執行檔案中去,這樣可執行檔案會比較大。

而動態鏈結則是指鏈結階段僅僅只加入一些描述資訊,而程式執行時再從系統中把相應動態庫載入到記憶體中去。

C程式編譯過程

題記 前幾天去華為面試實習生,面試官問了個問題,讓我說出乙個程式的詳細編譯過程,當時磕磕絆絆說了一堆東西,事後自己都不知道當時說了什麼,慚愧。c語言編譯過程 編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系...

C 程式編譯過程

首先是編譯過程整體簡介 編譯過程主要分為 4個過程 1 編譯預處理 預編譯程式完成的工作,可以說成是對源程式的 替換 工作。經過這個過程,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案。2 編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中...

C程式編譯過程

gcc編譯c 會有四個階段 預處理 將c 中的標頭檔案和巨集進行處理 彙編 把彙編 轉化成機器指令,並以特定的二進位制格式輸出儲存在 o這樣的目標檔案中 流程圖 參考閱讀 3.c程式分析 gcc e hello.c o hello.i 預處理 gcc s hello.i o hello.s 編譯 g...