在 c 程式的編譯過程中,依次要進行預處理、編譯、彙編、鏈結四個階段。這裡通過編譯 c 檔案 test.c 來展示 gcc 的工作流程。
例如:l test.c
#include int main()
printf(「hello world!\n」); return 0;
1. 預處理階段
由於在 test.c 中使用了標頭檔案 stdio.h,所以 gcc 在編譯時首先要把頭檔案 stdio.h
中的內容載入到 test.c 中的首部。
在 shell 中輸入命令「gcc -e test.c -o test.i」。其中,引數 e 告訴 gcc 命令只進行預編譯,不做其他處理;引數 o 用來指明輸出的檔名為 test.i。命令執行完畢後就會產生乙個
名為 test.i 的檔案。如下所示:
[root@localhost home]#gcc -e test.c -o test.i
[root@localhost home]#ls
test.c test.i test.i
2. 編譯階段
編譯階段是整個編譯過程中最複雜的乙個階段。這裡拿自然語言的翻譯過程作個對比。比如在把「i love china」翻譯成中文前,需要依次完成以下幾個步驟:
1)考察這個句子中每個單詞的拼寫是不是正確。
2)考察整個句子的語法(比如主謂賓、定狀補的結構等)是不是正確。
3)考察整個句子的語義是不是正確。
只有以上三個步驟都正常通過了,才能保證句子被正確翻譯。同樣,高階程式語言的編譯階段也必須實現這三個步驟。
1)步驟 1 稱為詞法分析,主要負責檢查關鍵字、識別符號等是否正確。
2)步驟 2 稱為語法分析,主要負責檢查程式中語句的語法是否正確。
3)步驟 3 稱為語義分析,主要負責檢查程式中語句的邏輯意義是否正確。
在 shell 中輸入命令「gcc -s test.i -o test.s」。其中,引數 s 告訴 gcc 命令只進行編譯,不做其他處理。命令執行完畢後就會產生乙個名為 test.s 的彙編檔案。如下所示:
[root@localhost home]#gcc -s test.i -o test.s
[root@localhost home]#ls
test.c test.i test.s
3. 彙編階段
彙編階段的任務是把匯程式設計序翻譯成 cpu 可以識別的二進位制檔案,該檔案又稱為目標檔案。
在 shell 中輸入命令「gcc -c test.s -o test.o」,其中,引數 c 告訴 gcc 命令只進行彙編,不做其他處理。命令執行完畢後就會產生乙個名為 test.o 的目標檔案。如下所示:
[root@localhost home]#gcc -c test.s -o test.o
[root@localhost home]#ls
test.c test.i test.o test.s
在 windows 系統中,目標檔案的字尾是 obj。
3. 鏈結階段
目標檔案雖然已經可以被 cpu 直接識別,但是單個目標檔案一般是無法執行的。原因在於乙個程式往往是由多個原始檔組成的,每個原始檔只對應乙個目標檔案。也許有人會
問, test 程式不就只有乙個原始檔 test.c 嗎,為什麼也不能直接執行呢?原因是 test.c 使用了 stdio.h 對應的庫函式,所以必須要把 test.o 檔案和函式庫檔案鏈結在一起才能運
行。鏈結階段的任務就是把程式中所有的目標檔案和所需的庫檔案都鏈結在一起,最終生成乙個可以直接執行的檔案,稱為可執行檔案。
在 shell 中輸入命令「gcc test.o -o test」,執行完畢後就會產生乙個名為 test 的
可執行檔案。輸入命令「./test」執行該檔案,就可以得到 test 檔案的執行結果「hello world!」。
如下所示:
[root@localhost home]#gcc test.o -o test
[root@localhost home]#./test
hello world!
gcc 命令生成的可執行檔案的有以下三種格式。
1)a.out(assembler and link editor output);
2)coff(common object file format);
3)elf(executable and linkable format);
其中,a.out 和 coff 格式都是比較老的格式,現在 linux 平台上可執行檔案的主流格式是 elf。
gcc工作流程
1.gcc工作流程 1預處理 e 巨集替換 標頭檔案展開 注釋去掉 c i c檔案 2編譯 s i s 彙編檔案 3彙編 c s o 二進位制檔案 4鏈結 o 可執行 在使用gcc編譯器的時候,我們必須給出一系列必要的呼叫引數和檔名稱。gcc編譯器的呼叫引數大約有100多個,其中多數引數我們可能根本...
Struts工作流程
文章分類 招聘求職 乙個使用者的請求是通actionservlet來處理和 的。那麼,actionservlet如何決定把使用者請求 給哪個action物件呢?這就需要一些描述使用者請求路徑和action衍射關係的配置資訊了。在struts中,這些配置對映資訊都儲存在特定的xml檔案struts c...
zf工作流程
zend controller是使用mvc模式來構建乙個站點的基礎。zend controller體系是乙個輕量的,模組化和可擴充套件的體系。它只提供最核心的必要的部分,允許開發者有很大的自由來靈活地構建自己的站點。使用zend controller的站點,其檔案組織和 結構會比較相似。zend c...