編譯器是由幾部分組成的,包括預處理器,編譯器,彙編器,鏈結器。
我們寫的**經過預處理器,變成 .i 檔案,再經過編譯器處理,變成 .s 檔案,再經彙編器,生成 .o 檔案,最後經鏈結器,變成可執行檔案。
預處理器,編譯器,彙編器,鏈結器都做了什麼呢,我們接著看
預處理指令例項:gcc -e file.c -o file.i
/*
19-1.h
this is a header file.
*/char
* p =
"hello"
;int i =
0;
// 19-1.c
#include
"19-1.h"
// begin to define macro
#define greet "hello world!"
#define inc(x) x++
// end
intmain()
gcc -e 19-1.c -o 19-1.i
得檔案 19-1.i 檔案,下面是 19-1.i 檔案
# 1
"19-1.c"
# 1""
# 1""
# 31
""# 1
"/usr/include/stdc-predef.h"13
4# 32""2
# 1"19-1.c"
# 1"19-1.h"
1char
* p =
"hello"
;int i =0;
# 3"19-1.c"
2int
main()
可以看到,注釋被直接去除,標頭檔案被直接展開,巨集定義被直接展開。以 # 開頭的資訊是給後續編譯器其他模組使用的。分析結束後進行**優化生成相應的彙編**檔案
編譯指令例項:gcc -s file.i -o file.s
gcc -s 19-1.i -o 19-1.s
生成 19-1.s 如下,裡面的彙編**這裡不做解析了。
彙編指令示例:gcc -c file.s -o file.o
編譯過程分為預處理,編譯,彙編和鏈結四個階段
1、預處理:處理注釋,巨集以及以 # 開頭的符號
2、編譯:進行詞法分析,語法分析和語義分析等
3、彙編:將彙編**翻譯成機器指令的目標檔案
C語言高階剖析 20 鏈結過程簡介
鏈結器的意義linux 下靜態庫的建立和使用 test.c include extern char name extern int add int a,int b int main slib.c char name intadd int a,int b gcc c slib.c o slib.o a...
C語言編譯全過程剖析
內容摘要c語言編譯的整個過程是非常複雜的,裡面涉及到的編譯器知識 硬體知識 工具鏈知識都是非常多的,深入了解整個編譯過程對工程師理解應用程式的編寫是有很大幫助的,希望大家可以多了解一些,在遇到問題時多思考 多實踐。一般情況下,我們只需要知道分成編譯和連線兩個階段,編譯階段將源程式 c 轉換成為目標 ...
C語言編譯全過程剖析
內容摘要c語言編譯的整個過程是非常複雜的,裡面涉及到的編譯器知識 硬體知識 工具鏈知識都是非常多的,深入了解整個編譯過程對工程師理解應用程式的編寫是有很大幫助的,希望大家可以多了解一些,在遇到問題時多思考 多實踐。一般情況下,我們只需要知道分成編譯和連線兩個階段,編譯階段將源程式 c 轉換成為目標 ...