c 編譯鏈結過程

2021-08-01 22:36:09 字數 707 閱讀 3005

llinux下編譯乙個c++程式的典型過程:

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

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

3. 彙編過程: 把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每乙個c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。

4.將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠誒作業系統裝入執行的統一整體。c++使用鏈結器以確保用到的函式都只被定義一次,以及確保static objects只被定義一次,會將我們做了宣告但卻未曾定義的函式檢測出來。

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

備註:c++不像其他現代程式語言一樣,用import或者using來引入當前原始檔用到的庫,必須用#include來機械的將庫的介面宣告以文字替換的方式引入,再重新parse一遍,這樣這編譯效率奇低,編譯器動輒要parse幾萬行的預處理源**,主要是預處理引入了不必要的依賴,這是在與c相容的條件下不得不做出的妥協。

編譯鏈結過程

在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...

c語言編譯 鏈結過程

c語言的編譯鏈結過程 把c程式 源 轉換成可以在機器上執行的程式 可執行 需要進行編譯和鏈結的過程。1 編譯 主要包含兩個過程 1 預處理 巨集定義 檔案包含 條件編譯。在正式開始編譯之前根據預處理命令來修改原始檔的內容 2 編譯 優化 通過詞法分析和語法分析將指令翻譯成彙編 2 彙編 把組合語言 ...

編譯鏈結過程(一)

什麼是編譯?什麼是鏈結?為什麼需要編譯和鏈結?在很久以前,計算機發展的初期,還在用機器語言編寫程式,量比較少時是不需要編譯和鏈結的。因為當時的程式設計師直接編寫機器碼讓計算機執行。每種cpu的指令是不相同的,所以每乙個程式要換一台不同cpu的機器上執行時,需要重新寫程式,而且機器語言 涉及很多計算機...