C 程式編譯過程

2021-06-18 17:39:38 字數 1088 閱讀 2021

首先是編譯過程整體簡介

編譯過程主要分為

4個過程  

1) 編譯預處理  

預編譯程式完成的工作,可以說成是對源程式的「替換」工作。經過這個過程,生成乙個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案。

2) 編譯、優化階段:

通過詞法分析、語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間**或彙編**。

在c++中,以下函式如果你沒有定義但是被需要時,編譯器會產生他們:預設建構函式、拷貝建構函式、析構函式、賦值運算子和一對取址運算子。

3) 彙編過程: 

把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每乙個

c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。

4) 將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠誒作業系統裝入執行的統一整體

。c++使用鏈結器以確保用到的函式都只被定義一次,以及確保static objects只被定義一次,會將我們做了宣告但卻未曾定義的函式檢測出來。

鏈結有靜態鏈結和動態鏈結。

這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,

其中的每個檔案含有庫中的乙個或者一組相關函式的**。   

在此種方式下,函式的**被放到稱作是動態鏈結庫或共享物件的某個目標檔案中。

鏈結程式此時所作的只是在最終的可執行程式中記錄下共享物件的名字以及其它少量

的登記資訊。在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應

備註:標頭檔案裡我們通常只放置宣告而不是定義,因為標頭檔案有可能被釋放到多個原始檔中,每個原始檔都會單獨編譯

,這樣鏈結

時就會發現全域性空間中有多個定義了。

編譯過程細節詳解

c語言編譯過程總結詳解

c & c++的編譯過程詳解

c語言link過程詳解(多檔案編譯過程)  

to be continued!

C程式編譯過程

題記 前幾天去華為面試實習生,面試官問了個問題,讓我說出乙個程式的詳細編譯過程,當時磕磕絆絆說了一堆東西,事後自己都不知道當時說了什麼,慚愧。c語言編譯過程 編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系...

C程式編譯過程

gcc編譯c 會有四個階段 預處理 將c 中的標頭檔案和巨集進行處理 彙編 把彙編 轉化成機器指令,並以特定的二進位制格式輸出儲存在 o這樣的目標檔案中 流程圖 參考閱讀 3.c程式分析 gcc e hello.c o hello.i 預處理 gcc s hello.i o hello.s 編譯 g...

C程式編譯過程

接觸程式設計還在麼長時間,還沒有好好理解下一段 從.c到可執行程式的過程。先看一下gcc的常用引數 引數詳解 c 只啟用預處理,編譯,和彙編,也就是他只把程式做成obj檔案 例子用法 gcc c hello.c 他將生成.o的obj檔案 s 只啟用預處理和編譯,就是指把檔案編譯成為彙編 例子用法 g...