GCC編譯程式

2021-09-28 11:53:05 字數 1938 閱讀 9299

gcc(gnu compiler collection)是linux下最主要的一種編譯工具。

gcc編譯格式:

gcc [選項] 源檔名 [選項] 目標檔名

採用預設得方式編譯原始檔,系統會生成a.out可執行檔案

採用顯式編譯成目標檔案,在編譯成可執行檔案

gcc -c hello.c #生成hello.o

gcc hello.o #生成a.out

gcc -o hello hello.o #生成hello

直接編譯成可執行檔案

編譯完後可執行的程式均為綠色字型,執行格式:

./程式的名稱

例如:./a.out或./hello

gcc編譯流程

編譯器的輸入是程式的原始檔,輸出是可執行得檔案或者可分發得二進位制**,中間過程便是編譯器要完成得工作。其程式得編譯流程為:

(1)預處理(預編譯)

本階段是針對標頭檔案(.h)進行編譯,即將這些標頭檔案編譯到當前原始檔中,預處理常用得選項是-e,它的作用是告訴編譯器,當預處理結束後停止編譯。

預處理的輸入是.c檔案,輸出是.i檔案

命令:gcc -e 原始檔 -o 目標檔案

gcc -e hello.c -o hello.i

(2)編譯

本階段是對**得規範性,語法得正確性進行檢查,並編譯成組合語言。編譯常用的選項是-s,它的作用是告訴編譯器,當編譯結束時,停止編譯。

編譯的輸入是.i檔案,輸出是.s檔案

命令:gcc -s 原始檔 -o 目標檔案

gcc -s hello.i -o hello.s

gcc -s hello.c -o hello.s

(3)彙編

本階段是將組合語言翻譯成目標檔案,彙編常用的選項是-c,它的作用是告訴編譯器,當彙編階段結束時停止編譯

彙編的輸入是.s檔案,輸出是.o檔案

命令:gcc -c 原始檔 -o 目標檔案

gcc -c hello.s -o hello.o

(4)鏈結

本階段是將所有的目標檔案以及相應的庫檔案編譯成可執行檔案,鏈結並不需要選項,只需要制定生成的可執行檔名。

鏈結的輸入是.o檔案,輸出是可執行檔案

命令:gcc 原始檔 -o 目標檔案

gcc hello.o -o hello

常用的編譯選項:

-o 後邊跟目標物件的名稱

-c 只編譯不鏈結,後邊跟原始檔

-g 開啟gdb除錯,gdb是乙個除錯工具

-wall 提示所有的警告資訊

-werror 將所有的警告當作錯誤處理

-static 靜態鏈結庫

-llibrary 鏈結名為library得庫檔案

-i dir 用於新增標頭檔案查詢目錄(include)

-l dir 用於新增庫檔案查詢目錄(library)

-g 新增除錯資訊,生成的目標檔案的大小會增大

gcc編譯程式的流程

gcc編譯器 gcc編譯器 c語言的編譯器gcc g gcc編譯程式的流程 原始檔 c 預處理 i 編譯 彙編 s 鏈結 o 可執行檔案 filename.c 預處理器 編譯器 彙編器 聯結器 excutefile 編譯執行五部曲 一般就三步 對 c檔案直接編譯後直接生成可執行檔案後執行 gcc b...

減小Gcc編譯程式的體積

眾所周知,gcc編譯的原始程式一般很大,其實有幾種方法能大大減小目標 的體積,一般有以下幾種方法。1 禁用除錯資訊 release編譯時不要加上 g開關。2 使用 os編譯程式。不要使用 funroll loops等可以加速程式執行但是會大大增加目標 體積的開關。3 編譯後的程式使用strip去除符...

減小Gcc編譯程式的體積

眾所周知,gcc編譯的原始程式一般很大,其實有幾種方法能大大減小目標 的體積,一般有以下幾種方法。1 禁用除錯資訊 release編譯時不要加上 g開關。2 使用 os編譯程式。不要使用 funroll loops等可以加速程式執行但是會大大增加目標 體積的開關。3 編譯後的程式使用strip去除符...