有關gcc的知識簡述

gcc的命令使用格式爲:gcc[選項][文件名][選項][文件名]

1. gcc 命令擁有數量龐大的編譯選項,按類型可以把選項分爲以下幾大類。

 

總體選項:用於控制編譯的整個流程。常用選項:

-c:對源文件進行編譯或彙編。

-E:對源文件進行預處理。

-S:對源文件進行編譯。

-o file:輸出目標文件 file。

-v:顯示編譯階段的命令。

 

 

 

警告選項:用於控制編譯過程中產生的各種警告信息。常用選項:

 

-W:屏蔽所有的警告信息。

 

-Wall:顯示所有類型的警告信息。

 

-Werror:出現任何警告信息就停止編譯。

調試選項:用於控制調試信息。常用選項:

-g:產生調試信息。

 

優化選項:用於對目標文件進行優化。常用選項:

-O1:對目標文件的性能進行優化。

-O2:在-O1 的基礎上進一步優化,提高目標文件的運行性能。-O3:在-O2 的基礎上進一步優化,支持函數集成優化。-O0:不進行優化。

 

連接器選項:用於控制鏈接過程。常用選項:-static:使用靜態鏈接。

 

-llibrary:鏈接 library 函數庫文件。

 

-L dir:指定連接器的搜索目錄 dir-shared:生成共享文件。

 

目錄選項:用於指定編譯器的文件搜索目錄。常用選項:

 

-Idir:指定頭文件的搜索目錄 dir-Ldir:指定搜索目錄 dir。

 

 

2. GCC 工作流程

 

c語言的編譯流程中,依次要進行:預處理,編譯,彙編,鏈接四個階段。

1. 預處理階段(展開頭文件)

ep:gcc -E test.c -o test.i

 

由於在 test.c 中使用了頭文件 stdio.h,所以 GCC 在編譯時首先要把頭文件 stdio.h 中的內容加載到 test.c 中的首部。

 

在 shell 中輸入命令“gcc -E test.c -o test.i”。其中,參數 E 告訴 gcc 命令只進行預編譯,不做其他處理;參數 o 用來指明輸出的文件名爲 test.i。命令運行完畢後就會產生一個名爲 test.i 的文件。

2. 編譯階段(語法檢查)

ep:gcc -S test.i -o test.s

 

編譯階段是整個編譯過程中最複雜的一個階段。這裏拿自然語言的翻譯過程作個對比。

 

比如在把“I love China”翻譯成中文前,需要依次完成以下幾個步驟:

 

1)考察這個句子中每個單詞的拼寫是不是正確。

 

2)考察整個句子的語法(比如主謂賓、定狀補的結構等)是不是正確。

 

3)考察整個句子的語義是不是正確。

 

只有以上三個步驟都正常通過了,才能保證句子被正確翻譯。同樣,高級編程語言的編譯階段也必須實現這三個步驟。

 

1 步驟 1 稱爲詞法分析,主要負責檢查關鍵字、標識符等是否正確。

 

2 步驟 2 稱爲語法分析,主要負責檢查程序中語句的語法是否正確。

 

3 步驟 3 稱爲語義分析,主要負責檢查程序中語句的邏輯意義是否正確。

 

在 shell 中輸入命令“gcc -S test.i -o test.s”。其中,參數 S 告訴 gcc 命令只進行編譯,不做其他處理。命令運行完畢後就會產生一個名爲 test.s 的彙編文件。

3. 彙編階段(產生目標文件)

ep:gcc -c test.s -o test.o

 

彙編階段的任務是把彙編程序翻譯成 CPU 可以識別的二進制文件,該文件又稱爲目標文件。

 

在 shell 中輸入命令“gcc -c test.s -o test.o”,其中,參數 c 告訴 gcc 命令只進行彙編,不做其他處理。命令運行完畢後就會產生一個名爲 test.o 的目標文件。

4. 鏈接階段(鏈接所有目標文件和庫文件)

ep:gcc test.o -o test


鏈接階段的任務就是把程序中所有的目標文件和所需的庫文件都鏈接在一起,最終生成一個可以直接運行的文件,稱爲可執行文件。

 

在 shell 中輸入命令“gcc test.o -o test”,運行完畢後就會產生一個名爲 test 的可執行文件。輸入命令“./test”執行該文件,就可以得到 test 文件的運行結果。

若未重命名 則 ./a.out 輸出


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章