c/c++程式編譯流程(預處理->編譯->彙編->鏈結)
1. 預處理
預處理相當於根據預處理指令組裝新的c/c++程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。
1.讀取c/c++源程式,對其中的偽指令(以#開頭的指令)進行處理2.將所有的「#define」刪除,並且展開所有的巨集定義
3.處理所有的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。這些偽指令的引入使得程式設計師可以通過定義不同的巨集來決定編譯程式對哪些**進行處理。預編譯程式將根據有關的檔案,將那些不必要的**過濾掉。
4.處理「#include」預編譯指令,將被包含的檔案插入到該預編譯指令的位置。
(注意:這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案)
5.刪除所有的注釋
6.新增行號和檔名標識。
以便於編譯時編譯器產生除錯用的行號資訊及用於編譯時產生的編譯錯誤或警告時能夠顯示行號
7.保留所有的#pragma編譯器指令
2. 編譯
將預處理完的檔案進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編**檔案。
3. 彙編
將編譯完的彙編**檔案翻譯成機器指令,並生成可重定位目標程式的.o檔案,該檔案為二進位制檔案,位元組編碼是機器指令。
彙編器是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的語法,也沒有語義,也不需要做指令優化,只是根據彙編指令和機器指令的對照表一一翻譯即可。
4. 鏈結
通過鏈結器將乙個個目標檔案(或許還會有庫檔案)鏈結在一起生成乙個完整的可執行程式。
由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。
鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也就是將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠被作業系統裝入執行的統一整體。
位址和空間分配符號決議 重定位
C C 程式編譯過程
編譯四個階段 編譯預處理,編譯階段,彙編階段,鏈結程式。編譯預處理 preprocessing 讀取源程式,對其中的偽指令 以 開頭的指令 和特殊符號進行處理。編譯 compilation 將經過預處理之後的程式轉換成特定彙編 的過程。彙編 assemble 將上一步的彙編 轉換成機器指令。鏈結 l...
java程式載入過程
public class myclass extends myclassfather unstatic u new unstatic final unstaticfinal uf new unstaticfinal static static final staticfinal sf new sta...
C C 程式載入lib靜態庫
使用visual studio 編寫c 程式有幾種配置lib的方法,以下是在 中載入lib檔案的方法 在專案所在目錄下建立資料夾lib,將lib檔案此路徑下,包括debug和release兩種模式編譯的lib檔案,此外根據程式的需要,分別考慮win32和x64的lib檔案。以下預處理指令用於載入li...