程式編譯的過程中就是將使用者的文字形式的源**(c/c++)轉化成計算機可以直接執行的機器**的過程。主要經過四個個過程:
預編譯程式所完成的基本上是對源程式的「替代」工作。經過此種替代,生成乙個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案(.i)。
預處理中替代的內容為
巨集定義#include檔案包含
條件編譯
特殊符號
將預編譯生成的檔案(.i)轉變成彙編**(.s)。這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把**翻譯成組合語言(.s)。
由彙編器將彙編**(.s)轉變成目標**(.o)。彙編過程實際上指把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每乙個c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。
由鏈結器將**在執行過程用到的其他目標**和庫檔案鏈結成為乙個可執行程式也就是目標程式(.exe、.elf、.axf等)。
由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。
鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠被作業系統裝入執行的統一整體。
在這種鏈結方式下,函式的**將從其所在的靜態鏈結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,其中的每個檔案含有庫中的乙個或者一組相關函式的**。
在最終的可執行程式中記錄下共享物件的名字以及其它少量的登記資訊。
動態鏈結程式將根據可執行程式中記錄的資訊找到相應的函式**。
使用動態鏈結能夠使最終的可執行檔案比較短小,並且當共享物件被多個程序使用時能節約一些記憶體,因為在記憶體中只需要儲存乙份此共享物件的**。
但並不是使用動態鏈結就一定比使用靜態鏈結要優越。在某些情況下動態鏈結可能帶來一些效能上損害。
程式編譯流程
c c 程式的基本編譯流程 test.c 預處理 test.i 編譯 test.s 彙編 test.o 鏈結 test.exe 關於程式編譯的一些規範和方法,首先把原始檔編譯程中間 檔案,windows平台下是.obj檔案,unix下是.o檔案即object file,這一動作叫做編譯 compil...
程式的編譯流程
程式的基本流程如圖 1.預處理 預處理相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。將所有的 define 刪除,並且展開所有的巨集定義 處理所有的條件編譯指令,如 if i...
c 程式編譯流程
預處理相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有巨集定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。注意 這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案 以便於編譯時編譯器產生除錯用的行號資訊及用於編譯時...