GCC编译过程以及对应FILE文件表
gcc/g++在執(zhí)行編譯工作的時候,總共需要4步
(1).預處理:生成.i的文件[預處理器cpp]
(2).編譯:將預處理后的文件轉換成匯編語言,生成文件.s[編譯器egcs]
(3).匯編:有匯編變?yōu)槟繕舜a(機器代碼)生成.o的文件[匯編器as]
(4).連接: 鏈接目標代碼,生成可執(zhí)行程序[鏈接器ld]
絕大多數(shù)編譯器并不是一個單一的龐大程序。它們通常由多達六七個稍小的程序所組成,這些程序由一個叫做“編譯器驅(qū)動器( compiler driver)的控制程序來調(diào)用。這些可以方便地從編譯器中分離出來的單獨程序包括:預處理器( preprocessor)、語法和語義檢查器( syntactic and semantic checker)、代碼生成器( code generator)、匯編程序( assembler)、優(yōu)化器( optimizer)、鏈接器( linker),當然還包括一個調(diào)用所有這些程序并向各個程序傳遞正確選項的驅(qū)動器程序( driver program)(見圖5-1)。優(yōu)化器幾乎可以加在上述所有階段的后面。當前的 SPARC編譯器在編譯器的前端和后端之間的中間表示層執(zhí)行絕大部分的優(yōu)化措施
總體選項(Overall Option)
-x language
明確指出后面輸入文件的語言為 language (而不是從文件名后綴得到的默認選擇). 這個選項應用于后面
所有的輸入文件,直到遇著下一個-x選項. language 的可選值 有 c, objective-c, c-header,
c++, cpp-output, assembler,和assembler-with-cpp.
-x none
關閉任何對語種的明確說明,因此依據(jù)文件名后綴處理后面的文件(就象是從未使用過-x選項).
如果只操作四個階段(預處理,編譯,匯編,連接)中的一部分,可以使用-x選項(或文件名后綴)告訴 gcc 從哪里開始,用-c, -S,或-E選項告訴 gcc 到 哪里結束.
注意,某些選項組合(例如, -x cpp-output -E)使 gcc 不作任何事情.
-c
編譯或匯編源文件,但是不作連接.編譯器輸出對應于源文件的目標文件.缺省情況下, GCC 通過用.o替換源文件名后綴.c, .i, .s,等等,產(chǎn)生目標文件名.可以使用-o 選項選擇其他名字.GCC 忽略-c 選項后面任何無法識別的輸入文件(他們不需要編譯或匯編).
-S
編譯后即停止,不進行匯編.對于每個輸入的非匯編語言文件,輸出文件是匯編語言文件.
缺省情況下, GCC 通過用.o替換源文件名后綴.c, .i,等等,產(chǎn)生 目標文件名.可以使用-o 選項選擇其他名字.
GCC 忽略任何不需要編譯的輸入文件.
-E
預處理后即停止,不進行編譯.預處理后的代碼送往標準輸出.
GCC 忽略任何不需要預處理的輸入文件.
-o file
指定輸出文件為 file.該選項不在乎 GCC 產(chǎn)生什么輸出,無論是可執(zhí)行文件,目標文件,匯編文件,還是預處理后的 C 代碼.
由于只能指定一個輸出文件,因此編譯多個輸入文件時,使用-o選項沒有意義,除非輸出一個可執(zhí)行文件.
如果沒有使用-o選項,默認的輸出結果是:可執(zhí)行文件為a.out, source.suffix的目標文件是source.o,匯編文件是 source.s,而預處理后的 C 源代碼送往標準輸出.
-v
(在標準錯誤)顯示執(zhí)行編譯階段的命令.同時顯示編譯器驅(qū)動程序,預處理器,編譯器的版本號.
-pipe
在編譯過程的不同階段間使用管道而非臨時文件進行通信.這個選項在某些系統(tǒng)上無法工作,因為那些系統(tǒng)的 匯編器不能從管道讀取數(shù)據(jù). GNU 的匯編器沒有這個問題.
GCC文件表
| file.c | C 源文件 |
| file.h | C 頭文件(預處理文件) |
| file.i | 預處理后的 C 源文件 |
| file.C | C++源文件 |
| file.cc | C++源文件 |
| file.cxx | C++源文件 |
| file.m | Objective-C 源文件 |
| file.s | 匯編語言文件 |
| file.o | 目標文件 |
| a.out | 連接的輸出文件 |
| TMPDIR/cc* | 臨時文件 |
| LIBDIR/cpp | 預處理器 |
| LIBDIR/cc1 | C 編譯器 |
| LIBDIR/cc1plus | C++編譯器 |
| LIBDIR/collect | 某些機器需要的連接器前端(front end)程序 |
| LIBDIR/libgcc.a | GCC 子例程(subroutine)庫 |
| /lib/crt[01n].o | 啟動例程(start-up) |
| LIBDIR/ccrt0 | C++的附加啟動例程 |
| /lib/libc.a | 標準 C 庫,另見 intro (3) |
| /usr/include | #include文件的標準目錄 |
| LIBDIR/include | #include 文件的標準 gcc 目錄 |
| LIBDIR/g++-include | #include 文件的附加 g++目錄 |
| LIBDIR | 通常為/usr/local/lib/machine/version. |
| TMPDIR | 來自環(huán)境變量 TMPDIR (如果存在,缺省為/usr/tmp ,否則為 /tmp). |
參考資料:
總結
以上是生活随笔為你收集整理的GCC编译过程以及对应FILE文件表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu20.04 编译运行apue
- 下一篇: GCC __builtin_expect