1. 程式人生 > >c++程式編譯過程

c++程式編譯過程

編譯主要分為4個過程:
預處理-編譯優化-彙編-連結
1) 編譯預處理 預編譯程式完成的工作,可以說成是對源程式的“替換”工作。經過這個過程,生成一個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案。
巨集定義命令;例如#define
條件編譯指令;例如#ifdef
標頭檔案包含指令;例如#include
特殊符號;例如__LINE__,__FILE__
預處理模組;例如#pragma

2) 編譯、優化階段:通過詞法分析、語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間程式碼或彙編程式碼
在C++中,以下函式如果你沒有定義但是被需要時,編譯器會產生他們:預設建構函式、拷貝建構函式、解構函式、賦值運算子和一對取址運算子。
3) 彙編過程: 把組合語言程式碼翻譯成目標機器指令

的過程。對於被翻譯系統處理的每一個C語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言程式碼。
4) 連結程式 :將有關的目標檔案彼此相連線,也即將在一個檔案中引用的符號同該符號在另外一個檔案中的定義連線起來,使得所有的這些目標檔案成為一個能夠誒作業系統裝入執行的統一整體
C++使用連結器以確保用到的函式都只被定義一次,以及確保static objects只被定義一次,會將我們做了宣告但卻未曾定義的函式檢測出來。
連結有靜態連結和動態連結。
靜態連結:在這種連結方式下,函式的程式碼將從其所在地靜態連結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些程式碼將被裝入到該程序的虛擬地址空間中。靜態連結庫實際上是一個目標檔案的集合,其中的每個檔案含有庫中的一個或者一組相關函式的程式碼。
動態連結:
在此種方式下,函式的程式碼被放到稱作是動態連結庫或共享物件的某個目標檔案中。連結程式此時所作的只是在最終的可執行程式中記錄下共享物件的名字以及其它少量的登記資訊。在此可執行檔案被執行時,動態連結庫的全部內容將被對映到執行時相應程序的虛地址空間。動態連結程式將根據可執行程式中記錄的資訊找到相應的函式程式碼。

備註:標頭檔案裡我們通常只放置宣告而不是定義,因為標頭檔案有可能被釋放到多個原始檔中,每個原始檔都會單獨編譯,這樣連結時就會發現全域性空間中有多個定義了。