日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言编译的五大过程详解

發布時間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言编译的五大过程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。