在大學里面大家都用過VC6.0來進行編程。VC6.0屬于集成開發環境,一份代碼從文本變成可執行的程序只需要在其中點擊幾個按鈕就行了,加之老師也只教過我們如何操作,并未介紹C語言的執行過程。上一篇曾提到過,Linux下的開發環境沒有集成,需要一個一個操作。這固然不如VC6.0方便,但學會如何使用gcc編譯器工具后,可以使我們加深對C語言執行過程的理解,這是非常重要的。
gcc編譯C程序的主要過程包括:預編譯(Preprocessing)——編譯(Compilation)——匯編(Assembly)——連接(Linking/Build) 四個過程,每個過程都分別進行不同的處理,下面假設已經寫好了一個文件:hello.c,并以此為例仔細介紹。
一、預編譯
該過程會對各種預處理指令(以#開頭的代碼行,如#include,#define,#ifdef等等)進行處理,刪除注釋和多余的空白字符。
命令:gcc -E hello.c -o hello.i
對命令的解釋:E是參數,是通知gcc對hello.c進行預編譯; ? ? ?o是參數,是對命令輸出結果進行導入操作,這里是將gcc -E hello.c操作結果輸出到文件hello.i(這里文件名可以自定義)進行保存。
注:Linux對大小寫敏感,此處必須為大寫E。
二、編譯
該過程會對代碼進行語法、語義分析和錯誤判斷,生成匯編代碼文件。
命令:gcc -S hello.i -o hello.s
對命令的解釋:S是參數,用于通知gcc對目標文件hello.i進行編譯。
三、匯編
該過程會將匯編代碼轉化為計算機可識別的二進制文件。
命令:gcc -c hello.s -o hello.o
對命令的解釋:c是參數,用于通知gcc對木匾文件hello.s進行指令轉換操作。
注:可以通過命令“readelf -a hello.o”將hello.o轉變為我們可以讀懂的形式。
四、連接
該過程就是將多個******.o文件合并成一個可執行文件(也就是二進制指令),類似windows下的.exe文件。
命令:gcc hello.o -o hello
對命令的解釋:hello就是我們最后能夠直接運行的可執行文件。
注:可以通過命令“objdump -d hello”將該可執行文件hello轉變為匯編語言;也可以通過readelf來讀該文件內容。
五、運行程序
直接雙擊輸出的可執行文件hello無效,需要通過命令行來使它運行。
命令:./hello
六、小結
其實,并不需要這么多步操作,只需要對最開始的文本文檔hello.c執行命令“gcc hello.c -o hello”,即可生成計算機可執行文件hello,然后執行命令“./hello”即可運行命令。之所以有這么多步,只是方便我們對C語言的編譯過程有個更深刻的了解。