C语言编译的五大过程详解
前言
說實話,很多人做了很久的C/C++,也用了很多IDE,但是對于可執行程序的底層生成一片茫然,這無疑是一種悲哀,可以想象到大公司面試正好被問到這樣的問題,有多悲催不言而喻,這里正由于換工作的緣故,所以打算系統的把之前用到的C/C++補一補。總述
從一個源文件(.c)到可執行程序到底經歷了哪幾步,我想大多數的人都知道,到時到底每一步都做了什么,我估計也沒多少人能夠說得清清楚楚,明明白白。其實總的流程是這樣的。(1)編輯hello.c
(2)預處理
預處理過程實質上是處理“#”,將#include包含的頭文件直接拷貝到hell.c當中;將#define定義的宏進行替換,同時將代碼中沒用的注釋部分刪除等
具體做的事兒如下:
(1)將所有的#define刪除,并且展開所有的宏定義。說白了就是字符替換
(2)處理所有的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些
(3)處理#include,將#include指向的文件插入到該行處
(4)刪除所有注釋
(5)添加行號和文件標示,這樣的在調試和編譯出錯的時候才知道是是哪個文件的哪一行
(6)保留#pragma編譯器指令,因為編譯器需要使用它們。
gcc -E hello.c -o a.c可以生成預處理后的文件。通過查看文件內容和文件大小可以得知a.c講stdio.h和stdlib.h包含了進來。
(3)編譯
編譯的過程實質上是把高級語言翻譯成機器語言的過程,即對a.c做了這些事兒
(1)詞法分析,
(2)語法分析
(3)語義分析
(4)優化后生成相應的匯編代碼
從 高級語言->匯編語言
gcc -S hello.c -o a.s可以生成匯編代碼
匯編代碼如下。
(4) 匯編
匯編就是將匯編語言轉成機器語言
匯編語言->機器語言(二進制)
gcc -c hello.c -o a.o將源文件翻譯成二進制文件。類Uinx系統編譯的結果生生成.o文件,Windows系統是生成.obj文件。
編譯的過程就是把hello.c翻譯成二進制文件。
(5)鏈接
就像剛才的hello.c它使用到了C標準庫的東西“printf”,但是編譯過程只是把源文件翻譯成二進制而已,這個二進制還不能直接執行,這個時候就需要做一個動作,將翻譯成的二進制與需要用到庫綁定在一塊。打個比方編譯的過程就向你對你老婆說,我要吃雪糕。你只是給你老婆發出了你要吃雪糕的訴求而已,但是雪糕還沒有到。綁定就是說你要吃的雪糕你的老婆已經給你買了,你可以happy。gcc hello.c -o a可以生成可執行程序。即gcc不帶任何參數。ldd就可以看到你的可執行程序依賴的庫。可以看到a.o的大小是1.1k,畢竟他只是把源文件翻譯成二進制文件。a卻有7k,應該是他多了很多“繩子”吧。在運行的時候這些“繩子”就將對應的庫函數“牽過來”。很形象的比喻是不是?哈哈。libc.so.6 中就對咱們用的printf進行了定義
加C/C++學習交.流群獲取C語言、C++、Windows高級編程,MFC框架編程、QT框架編程,Linux應用程序開發,Linux內核研究等系統學習路線,更有進階干貨的直播免費學習權限 ,都是大牛帶飛 讓你少走很多的彎路的 群…號是 787190917
總結
以上是生活随笔為你收集整理的C语言编译的五大过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乘法逆元(inverse element
- 下一篇: 免费DDNS解析教程