Linux C編程學習之開發工具1---GCC編譯器

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程序
相關文章
相關標籤/搜索