程式的編譯流程

2021-07-13 03:06:13 字數 1103 閱讀 9353

程式的基本流程如圖:

1. 預處理

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

①將所有的「#define

」刪除,並且展開所有的巨集定義

②處理所有的條件編譯指令,如:「#if」、「#ifdef」、「#elif」、「#else」、「endif」等。這些偽指令的引入使得程式設計師可以通過定義不同的巨集來決定編譯程式對哪些**進行處理。預編譯程式將根據有關的檔案,將那些不必要的**過濾掉。

③處理「#include

」預編譯指令,將被包含的檔案插入到該預編譯指令的位置。

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

2. 編譯

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

3. 彙編

將編譯完的彙編**檔案翻譯成機器指令,並生成可重定位目標程式的.o

檔案,該檔案為

二進位制檔案

,位元組編碼是機器指令。

彙編器是將彙編**轉變成機器可以執行的指令,每乙個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的語法,也沒有語義,也不需要做指令優化,只是根據彙編指令和機器指令的對照表一一翻譯即可。

4. 鏈結

通過鏈結器將乙個個目標檔案(或許還會有庫檔案)鏈結在一起生成乙個完整的可執行程式。

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

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

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

至此,大致經過這幾個步驟,乙個完整的可執行程式產生了。

程式編譯流程

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

程式編譯流程

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

c 程式編譯流程

預處理相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。注意 這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案 以便於編譯時編譯器產生除錯用的行號資訊及用於編譯時...