GCC簡介程序員
GCC(GNU Compiler Collection)是一套功能強大、性能優越的編程語言編譯器,它是GNU計劃的表明做品之一。GCC以GPL和LGPL許可證發行,它是類Unix和蘋果電腦 Mac OS X操做系統的標準編譯器編程
除了支持C,還支持C++、Java編程語言
GCC經常使用選項函數
1. 基本選項性能
類型 | 說明 |
-E | 預處理後即中止,不進行編譯、彙編及鏈接 |
-S | 編譯後即中止,不進行彙編及鏈接 |
-c | 編譯或彙編源文件,可是不進行鏈接 |
-o file | 指定輸出文件爲 file |
例子:測試
gcc -E -o test.i test.c 將test.c 文件編輯(-E 說明預處理後即中止,不進行編譯、彙編及鏈接),而後將預處理以後的輸出輸出到 test.i(經過 -o 說明)優化
gcc -S -o test.s test.i 將上一步的預處理獲得的文件 test.i 進行編譯成彙編語言的文件test.sspa
gcc -c test.s -o test.o 將上一步的彙編文件,編譯成目標文件,可是不進行鏈接(因此是不能執行的)操作系統
gcc -o test test.o 將上一步編譯的目標文件進行鏈接,生成可執行文件 test調試
上面的這種方式從預處理、彙編、鏈接一步一步走下來,可是在真實的開發環境中是一步從 .c源文件編譯成可執行文件的:gcc -o test test.c
2.警告選型、
在編譯程序的過程當中,編譯器的報錯和警告信息對於程序員來講是很是重要的。GCC 包含了完整的出錯檢查和警告提示功能,它們能夠幫助Linux 程序員儘快找出錯誤的或者潛在的錯誤代碼,從而寫出更加專業和優美的代碼
類型 | 說明 |
-Wall | 啓動全部警告信息 |
-Werror | 在發生警告時取消編譯操做,即將警告看做是錯誤 |
-w | 禁用全部警告信息 |
例子: gcc -Wall -o test test.c 在編譯test.c文件的時候顯示全部的警告信息
3.優化選項
-O0:不進行優化處理
-O或者-O1:進行基本優化,這些優化在大多數狀況下會使程序執行的更快
-O2:除了完成-O1級別的優化外,還要一些額外的調整工做,好比處理器指令調度等,這是GNU發佈軟件的默認優化級別
-O3:除了完成-O2級別的優化外,還進行循環的展開以及其餘一些與處理器特性相關的優化工做
-Os:生成最小的可執行文件,主要用在嵌入式領域
通常來說,優化的級別越高,生成的可執行文件的運行速度越快,可是消耗在編譯上的時間就越長,所以在開發的時候儘可能不要使用優化選項,在軟件發行或者開發結束的時候才考慮對代碼進行最終的優化。 建議使用-O2
這裏介紹一個測試程序執行時間的命令:time 可執行文件(例如:time ./test),將會顯示相似以下的信息
real 0m1.206s //總的執行時間(包括進程的調度和切換) user 0m1.172s //用戶態執行的時間 sys 0m0.018s //內核態執行的時間
4.鏈接器選項
頭文件:主要包含函數的聲明部分,不包括函數的具體定義
庫文件:函數的具體實現是在庫文件中完成的
靜態庫文件:編譯連接時,靜態庫文件的源碼全都添加到可執行文件中,運行時就直接使用,可是生成的可執行文件通常比較大(靜態庫文件的後綴是 .a)
動態庫文件:編譯連接時,動態庫文件的並不將源碼添加到可執行文件中,而是在程序執行時由運行時的鏈接文件加載動態庫文件,這樣就更省系統開銷。(動態庫文件的後綴是 .so)
類型 | 說明 |
-Idirectory | 向GCC的頭文件搜索路徑中添加新的目錄 |
-Ldirectory | 向GCC的庫文件搜索路徑中添加新的目錄 |
-llibrary | 提示鏈接程序在建立可執行文件時包含指定的庫文件,例如-lm表示鏈接到指定的math庫 |
-static | 強制使用靜態連接庫,由於默認是使用動態連接庫的 |
-shared | 生成動態庫文件 |
例子:(文件名是 test.c)
#include<stdio.h> #include<math.h> int main() { int i=1; printf("%d\b", sin(i)); return 0; }
使用 gcc -o test test.c 編譯源代碼,可是在鏈接程序時出現錯誤,因此不能正確編譯
主要是由於在C語言中,默認狀況下只會鏈接C 語言的標準庫(標準庫的路徑是 /usr/lib/libc.so),可是 頭文件 math.h 所對應的庫文件並不在標準庫中,而是在 /usr/lib/libm.so,因此須要顯式指定。
因此應該使用這個命令:gcc -o test test.c /usr/lib/libm.so 。這樣就能夠編譯經過
或者使用 gcc -o test test.c -lm。 這裏面-lm 選項就是表示指定 math庫
5.其餘選項
類型 | 說明 |
-x language | 指定輸入文件的編程語言(默認gcc 是根據源文件的後綴識別源文件的,可是也能夠經過 -x強制顯式指定) |
-v | 顯示編譯器的版本號 |
-g | 得到有關調試程序的詳細信息,須要結合gdb 一塊兒使用,參見下一篇博客 |
-ansi | 支持符合ANSI標準的C程序 |