一、預處理
預處理指令的執行主要包含下列事情:
1.標頭檔案的包含
2.注釋的刪除
3.巨集定義的替換
4.條件編譯的選擇
指令:gcc -e test.c -o test.i
/* 呼叫的是預處理器cpp, -e:只進行預處理操作,-o:輸出到《檔案》 , .i表示產生的臨時檔案 intermediate */
二、編譯
編譯之前,c語言編譯器會進行詞法分析、語法分析(-fsyntax-only)。
在確認所有的指令都符合語法規則之後,將其翻譯成相應的字尾為s的彙編檔案。
指令:gcc -s test.i -o test.s
/* 呼叫的是編譯器ccl, -s:編譯到組合語言,不進行彙編和鏈結, .s:表示彙編檔案,注意於.s彙編檔案的區別 */
.s :組合語言源程式;彙編
.s:組合語言源程式;預處理,彙編
小寫的s檔案,在後期階段不在進行預處理操作,所以我們不能在這裡面寫預處理的語句在裡面
大寫的s檔案,還會進行預處理、彙編等操作,所以我們可以在這裡面加入預處理的命
三、彙編
在編譯與彙編之間,編譯器通常還會做一些優化操作。
彙編過程實際上指把組合語言**翻譯成目標機器指令的過程
指令:gcc -c test.s -o test.o
/* 呼叫的是彙編器as,-c:編譯、彙編到目標**,不進行鏈結, .o表示產生目標檔案, object
此時用file檢視test.o檔案的型別為elf 32-bit lsb relocatable型別,這是可重定位的格式 */
四、鏈結
由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。例如,某個原始檔中的函式可能引用了另乙個 原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。
鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠誒作業系統裝入執行的統一整體。
函式庫一般分為靜態庫和動態庫兩種。靜態庫是指編譯鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不再需要庫檔案了。其字尾名一般為」.a」。動態庫與之相反,在編譯鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時由執行時鏈結檔案載入庫,這樣可以節省系統的開銷。動態庫一般字尾名為」.so」,如前面所述的libc.so.6就是動態庫。gcc在編譯時預設使用動態庫。
指令:gcc test.o -o test
/* 用file檢視test檔案型別為:elf 32-bit lsb executable,這是可以被執行的檔案格式 */
預處理 編譯 彙編 鏈結
1.預處理 預處理器 預處理階段主要處理 include 和 define 它把 include包含進來的 h 檔案插入到 include 所在的位置,把源程式中使用到的用 define 定義的巨集用實際的字串代替。2.編譯階段 編譯器 在這個階段,編譯器先要檢查 的規範性和語法錯誤等,以確定 的實...
預處理,編譯, 優化, 彙編, 鏈結
編譯,編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處理讀...
預處理,編譯, 優化, 彙編, 鏈結
編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言 目標檔案 並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。c源程式標頭檔案 預編譯處理 cpp 編譯程式本身 優化程式 匯程式設計序 鏈結程式 可執行檔案 1.編譯預處...