1. 程式人生 > >C語言程式的編譯、連結具體過程及Linux環境下的具體例項

C語言程式的編譯、連結具體過程及Linux環境下的具體例項

我們知道一個C語言程式從編寫完成到生成可執行檔案分為預處理、編譯、彙編、連結,最後再生成可執行檔案。

預處理階段

前處理器主要做四部分工作,分別是:標頭檔案展開、巨集替換、去註釋以及條件編譯。

(1)標頭檔案展開就是編譯器會根據字元#開頭的命令去讀取相應的系統檔案或者自定義檔案, 並把相應的檔案直接插入到當前程式程式碼中,這就完成了標頭檔案的展開。
(2)巨集替換就是將程式設計師自定義的巨集變數、巨集函式等直接替換,如:#define SIZE 10,在巨集替換的過程中直接將程式碼中出現SIZE的地方用10替換掉,不考慮型別、優先順序等,所以在定義和使用巨集的時候程式設計師自己要注意這一問題,巨集函式這裡先不做具體解釋。
(3)

去註釋就是將程式碼中的註釋部分直接減掉,簡單易懂。
(4)條件編譯就是根據程員的思考及設計,對程式程式碼中的部分程式碼進行處理,配合巨集定義語句使得滿足條件或者不滿足條件的程式碼直接個當做註釋部分一樣被裁減掉,具體看程式設計師自己的設計。

編譯階段

就是將C語言轉換成組合語言的一個過程。組合語言程式中的每條指令都以一種標準的文字格式確切的描述了一條低階機器語言指令。

彙編階段

就是將組合語言就是將組合語言翻譯成機器語言指令的一個過程,由彙編器完成,處理完成之後得到一個二進位制檔案。

連結階段

由聯結器負責完成,它將程式碼中呼叫的庫函式、外部函式、程式設計師自己編寫的函式等所有檔案(經過彙編階段完成後得到的二進位制檔案)處理成一個可執行檔案,這就是連結階段完成的。

Linux環境分階段檢視

(CentOS 7.0 64bit)

Linux環境下在程式的預處理、編譯、彙編、連結的過程都可以用gcc的系列命令得到其文字檔案,以hello world程式為例,當這個程式編寫完成以後(假設命名為hello.c),
(1)用gcc -E hello.c -o hello.i 命令就可以得到一個預處理完成之後的檔案,用編輯器開啟就可得到前面所提到的標頭檔案展開、巨集替換、去註釋、條件編譯,這四項工作完成以後的檔案hello.i,而且可以清楚的看到原hello world程式的變化,
(2)然後用gcc -S hello.i -o hell.s 命令就可以得到一個全是組合語言的檔案hello.s,用檔案編輯器開啟可以看到一系列的組合語言程式碼,
(3)再然後用gcc -c hello.s -o hello.o 命令就可以得到一個二進位制檔案hello.o,如果用編輯器開啟會得到一堆亂碼的檔案,
(4)最後再用gcc hello.o -o hello 命令就得到一個可執行的檔案hello,輸入./hello之後就會在螢幕上顯示hello world.