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...