c 程式編譯流程

2021-08-05 23:30:16 字數 973 閱讀 5878

預處理相當於根據預處理指令組裝新的c/c++程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。

(注意:這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案)

以便於編譯時編譯器產生除錯用的行號資訊及用於編譯時產生的編譯錯誤或警告時能夠顯示行號

將預處理完的檔案進行一系列詞法分析、語法分析、語義分析及優化後,產生相應的彙編**檔案。

將編譯完的彙編**檔案翻譯成機器指令,並生成可重定位目標程式的.o檔案,該檔案為二進位制檔案,位元組編碼是機器指令。

由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。

例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。

鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也就是將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠被作業系統裝入執行的統一整體。

編譯器把**檔案編譯處理為乙個可執行的二進位制檔案,在window上字尾為exe的可執行檔案,linux上生成的可執行檔案沒有字尾來標示,比如,從乙個c源**檔案變成乙個可執行檔案,這期間編譯器做了很多事情這些事情依次是:預處理(巨集展開等),編譯(將c**翻譯成為彙編指令),彙編(將彙編**翻譯成機器指令,也叫可重定位目標檔案),鏈結(鏈結由彙編產生的目標檔案)。

經過彙編後的目標檔案可以被鏈結成為二進位制可執行檔案。主題來了,鏈結做了什麼?請看上面的資料三,把多個檔案鏈結成為乙個檔案,之前的各個檔案中的 符號,變數在記憶體中的位址是相對的,鏈結過程中會把多個檔案的相同型別資料段**段放在一起,所以需要將裡面的符號變數重新安置在乙個確定的記憶體位址中,這就是重定位,

程式編譯流程

c c 程式的基本編譯流程 test.c 預處理 test.i 編譯 test.s 彙編 test.o 鏈結 test.exe 關於程式編譯的一些規範和方法,首先把原始檔編譯程中間 檔案,windows平台下是.obj檔案,unix下是.o檔案即object file,這一動作叫做編譯 compil...

程式編譯流程

程式編譯的過程中就是將使用者的文字形式的源 c c 轉化成計算機可以直接執行的機器 的過程。主要經過四個個過程 預編譯程式所完成的基本上是對源程式的 替代 工作。經過此種替代,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案 i 預處理中替代的內容為 巨集定義 include檔案包含 ...

程式的編譯流程

程式的基本流程如圖 1.預處理 預處理相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。將所有的 define 刪除,並且展開所有的巨集定義 處理所有的條件編譯指令,如 if i...