在這個互聯網時代,很多人都選擇了計算機專業,而只要是計算機專業的小伙伴,可能都會學C語言,但是大家是否都清楚C語言編譯的完整程序呢,今天我就帶著大家一起來做個解密吧,
C語言相對于匯編語言是一種高級語言,要想在系統上運行,需要通過編譯器把它轉換成機器能夠讀懂的可執行的代碼,
以Linux系統上的gcc為例,通常我們編譯一個源檔案都是用下面的命令:
$gcc hello.c –o hello

編譯成功后,目錄里會生成hello這個程式,直接運行它可以看到結果,
$./hello
Hello World!
但hello這個程式是怎么生成的呢,其實中間還是有好幾步的,用下面這個命令重新編譯一下,你可以看到所有的中間檔案,
$gcc -save-temps hello.c –o hello
$ls
hello hello.c hello.i hello.o hello.s
C編譯器的編譯程序主要分成四步:
(1) 預處理
(2) 編譯
(3) 匯編
(4) 連接

1) 預處理 Pre-prosssing
預處理生成了hello.i 的中間檔案,主要完成了下面幾步:
? 去掉所有的注釋
? 展開所有的宏定義(也就是做字符替換)
? 插入#include檔案的內容
? 處理所有的條件編譯
hello.i 檔案內容如下(檔案較大,只展示了最下面的一塊):

可以發現源代碼中所有的注釋被洗掉了,并且插入了stdio.h頭檔案的內容,
2)編譯 Compiling
編譯將 hello.i 檔案編譯生成一個中間檔案 hello.s,打開可以看到里邊都是匯編語言,所以編譯的作用就是把源代碼轉換成匯編語言,

3)匯編 Assembly
匯編器將 hello.s 匯編成 hello.o 檔案,hello.o是二進制檔案,里邊都是機器可以執行的代碼,

4)連接 Linking
連接顧名思義起到了一個連接作用,雖然 hello.o 已經是二進制檔案了,但是里邊用到的比如 printf 函式需要呼叫別的庫,連接器將我們的二進制檔案和其他庫做了一個系結,可以看到連接后生成的 hello 檔案要比 hello.o 大的多,

到這里 C的完整編譯流程就結束了,本文的示例用的是Linux作業系統,編譯器用的是 gcc,但在其他作業系統,比如 Unix、Windows,或者用其他編譯器,原理都是一樣的,感興趣的同學可以去學習一下編譯原理,會對編譯有更深入的理解,

不管你是轉行也好,初學也罷,進階也可
——【值得關注進入】的C/C++編程學習進階俱樂部 ——
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

一個活躍、高格調、高層次的程式員編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/227214.html
標籤:C
上一篇:快速冪
下一篇:core dump分析
