標籤:連結器 line 庫檔案 text 根據 源檔案 目標 center 刪除
轉自:https://www.cnblogs.com/Lynn-Zhang/p/5377024.html
C/C++程式編譯流程(預先處理->編譯->彙編->連結)
程式的基本流程
1. 預先處理
預先處理相當於根據預先處理指令組裝新的C/C++程式。經過預先處理,會產生一個沒有宏定義,沒有條件編譯指令,沒有特殊符號的輸出檔案,這個檔案的含義同原本的檔案無異,只是內容上有所不同。
①將所有的“#define”刪除,並且展開所有的宏定義
②處理所有的條件編譯指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。這些偽指令的引入使得程式員可以通過定義不同的宏來決定編譯器對哪些代碼進行處理。先行編譯程式將根據有關的檔案,將那些不必要的代碼過濾掉。
③處理“#include”先行編譯指令,將被包含的檔案插入到該先行編譯指令的位置。
(注意:這個過程可能是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案)
2. 編譯
將預先處理完的檔案進行一系列詞法分析、文法分析、語義分析及最佳化後,產生相應的彙編代碼檔案。
3. 彙編
將編譯完的彙編代碼檔案翻譯成機器指令,並產生可重定位目標程式的.o檔案,該檔案為二進位檔案,位元組編碼是機器指令。
彙編器是將彙編代碼轉變成機器可以執行的指令,每一個彙編語句幾乎都對應一條機器指令。所以彙編器的彙編過程相對於編譯器來講比較簡單,它沒有複雜的文法,也沒有語義,也不需要做指令最佳化,只是根據彙編指令和機器指令的對照表一一翻譯即可。
4. 連結
通過連結器將一個個目標檔案(或許還會有庫檔案)連結在一起產生一個完整的可執行程式。
由組譯工具產生的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源檔案中的函數可能引用了另一個源檔案中定義的某個符號(如變數或者函數調用等);在程式中可能調用了某個庫檔案中的函數,等等。所有的這些問題,都需要經連結程式的處理方能得以解決。
連結程式的主要工作就是將有關的目標檔案彼此相串連,也就是將在一個檔案中引用的符號同該符號在另外一個檔案中的定義串連起來,使得所有的這些目標檔案成為一個能夠被作業系統裝入執行的統一整體。
至此,大致經過這幾個步驟,一個完整的可執行程式產生了。
C/C++程式編譯流程(預先處理->編譯->彙編->連結)