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去除符...