Linux技術——gcc基礎

readyao發表於2016-04-03

GNU CC(通常稱為GCC)是GNU專案的編譯器,它能夠編譯C、C++語言編寫的程式。
gcc是Linux開發的基礎,gcc能夠支援多種不同的C語言版本,同時提供Linux、Unix、Windows下的編譯版本。
使用gcc,程式設計師可以對編譯過程有更多的控制,編譯過程分為3個階段。
–預處理;
–彙編;
–連結;

使用gcc,程式設計師可以控制生成二進位制執行檔案中除錯程式碼的數量和型別。
和其他編譯器一樣,gcc也可以優化執行程式碼。
gcc是個交叉平臺編譯器,所以能夠在當前CPU平臺上為不同作業系統開發軟體。
gcc對C和C++進行了一些擴充套件,有助於提高執行效率以及編譯器進行程式碼優化。
gcc可以讓跨平臺程式設計更加容易,降低程式碼移植代價。

深入瞭解gcc之前,我們先看一個小例子。

#include <stdio.h>
int main(int arg, char *args[])
{
    if (arg < 3)
        printf("請輸入2個引數\n");
    else
    {
        int a = atoi(args[1]);
        int b = atoi(args[2]);
        printf("%d%d 等於 %d\n", a, b, a + b);
    }
    return 0;
}

在命令列鍵入命令編譯和執行這段程式
$gcc -o hello hello.c
這行命令告訴gcc對源程式hello.c進行編譯和連結,並使用引數-o指定建立名為hello的可執行程式。
整個過程看上去彷彿是一氣呵成的,但其實是分幾步的
–預編譯原始碼;
–編譯目的碼;
–連結程式。

預編譯、編譯和連結過程

預編譯
在命令列鍵入命令。
$gcc -o hello1.c -E hello.c
這行命令告訴gcc對源程式hello.c進行預編譯,預編譯結果輸出到hello1.c檔案中。

編譯
在命令列鍵入命令。
$gcc -o hello.o -c hello1.c
這行命令告訴gcc對源程式hello.c進行編譯,但不連結,編譯輸出到hello.o檔案中。

連結
在命令列鍵入命令。
$gcc -o hello hello.o
這行命令告訴gcc對源程式hello.o進行連結,生成可執行程式hello。

gcc各個選項的意思:
-o filename 輸出檔名,如果沒指定filename,預設為a.out
-c 只編譯,不連結
-E 預編譯
-S 彙編
-g 包含除錯資訊
-I 指定包含標頭檔案路徑
-D 編譯時定義指定的巨集,相當於原始碼中的#define巨集定義
-L 指定要連結庫檔案的路徑
-l 連結指定的庫檔案
-O 優化編譯後的程式碼
-w 關閉所有告警資訊
-Wall 開啟所有告警資訊
-Werror Warning當做錯誤處理
-static 強制連結時連結靜態庫
-fPIC 編譯與位置無關的程式碼,主要用於編譯共享庫
-shared 生成共享庫so檔案
-pedantic 發現一些不符合 ANSI/ISO C標準的程式碼

gcc是如何知道檔案型別呢?
通過副檔名判斷檔案型別

c C語言原始檔
cpp C++原始檔
s 組合語言原始檔
o 編譯後的目的碼檔案
a,so 編譯後的庫檔案

相關文章