常用檔名字尾及其表示的檔案型別如下表:
檔名字尾
檔案型別
.cc 原始檔
.i預處理後的 c 原始檔
.ii預處理後的 c++ 原始檔
.hc 或 c++ 標頭檔案
.c .cc .cp .cpp .c++ .cxx
c++ 原始檔
.s匯程式設計序檔案
.s必須預處理的匯程式設計序檔案
.o目標檔案
.a靜態鏈結庫
.so動態鏈結庫
預處理之後原始碼中不再包含任何預處理語句。例如:
gcc預處理階段可以生成.i
的檔案,通過選項-e
可以使編譯器在預處理結束時就停止編譯。 例如:
gcc -e -o hello.i hello.c
這一階段,編譯器對原始碼進行詞法分析、語法分析、優化等操作,最後生成彙編**。這是整個過程中最重要的一步,因此也常把整個過程稱為編譯
。
可以通過選項-s
使 gcc 在進行完編譯後停止,生成.s
的匯程式設計序。例如:
gcc -s -o hello.s hello.c
這一階段使用彙編器對彙編**進行處理,生成機器語言**,儲存在字尾為.o
的目標檔案中。當程式由多個**檔案構成時,每個檔案都要先完成彙編工作,生成 .o 目標檔案後,才能進入下一步的鏈結工作。
gcc -c -o hello.o hello.c
經過彙編以後的機器**還不能直接執行。為了使作業系統能夠正確載入可執行檔案,檔案中必須包含固定格式的資訊頭,還必須與系統提供的啟動**鏈結
起來才能正常執行,這些工作都是由鏈結器來完成的。例如:
gcc -o hello hello.c
使用舉例:gcc [-wall]
[-o1..3]
[-g]
[-o name] file...
按照選項作用所對應的編譯階段,可將 gcc 的選項分為四組:預處理選項、編譯選項、優化選項和連線選項。
選項格式
功能-c
在預處理後的輸出中保留原始檔中的注釋
-d name
預定義乙個巨集 name,而且其值為 1
-d name=definition
預定義乙個巨集 name,並指定其值為 definition 所指定的值。其作用等價於在原始檔中使用巨集定義指令:#define name definition。但 -d 選項比巨集定義指令的優先順序高,它可以覆蓋原始檔中的定義
-u name
取消先前對 name 的任何定義,不管是內建的,還是由 -d 選項提供的
-i dir
指定搜尋標頭檔案的路徑 dir。先在指定的路徑中搜尋要包含的標頭檔案,若找不到,則在標準路徑(/usr/include, /usr/lib及當前工作目錄)上搜尋
-e只對指定的原始檔進行預處理,不做編譯,生成的結果送到標準輸出
選項格式
功能-c
只生成目標檔案,不進行連線。用於對原始檔的分別編譯
-s只進行編譯,不做彙編,生成彙編**檔案格式,其名與原始檔相同,但擴充套件名為 .s
-o file
將輸出放在檔案file中。如果未使用該選項,則可執行檔案放在 a.out 中
-g指示編譯程式在目標**中加入供除錯程式 gdb 使用的附加資訊
-v在標準出錯輸出上顯示編譯階段所執行的命令,即編譯驅動程式及預處理程式的版本號
優化分為對中間**的優化和針對目標碼生成的優化。
選項格式
功能object-file-name
不以專用字尾結尾的檔名就認為是目標檔名或庫名。連線程式可以根據檔案內容來區分目標檔案和庫
-c -s -e
如果使用其中任何乙個選項,那麼都不執行連線程式,而且目標檔名不應該用做引數
-llibrary
連線時搜尋由 library 命名的庫。連線程式按照在命令列上給定的順序搜尋和處理庫及目標檔案。實際的庫名是 liblibrary.a
-static
在支援動態連線的系統中,它強制使用靜態鏈結庫,而阻止連線動態庫;而在其他系統中不起作用.把指定的目錄 dir 加到連線程式搜尋庫檔案的路徑表中,即在搜尋-l後面
-l dir
列舉的庫檔案時,首先到 dir 下搜尋,找不到再到標準位置下搜尋
-bprefix
該選項規定在什麼地方查詢可執行檔案、庫檔案、包含檔案和編譯程式本身資料檔案
-o file
指定連線程式最後生成的可執行檔名稱為 file,不是預設的 a.out
gcc編譯過程
本文對gcc編譯器如何工作做乙個概要描述.更為詳細的資訊請參考編譯器手冊。當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。...
gcc編譯過程
當我們進行編譯的時候,要使用一系列的工具,我們稱之為工具鏈.其中包括 預處理器cpp,編譯器前端gcc g 彙編器as,聯結器ld.乙個編譯過程包括下面幾個階段 1 預處理。預處理器cpp將對原始檔中的巨集進行展開。2 編譯。gcc將c檔案編譯成彙編檔案。3 彙編。as將彙編檔案編譯成機器碼。4 連...
GCC編譯選項
gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...