gcc編譯基本用法

2021-08-07 08:53:32 字數 3328 閱讀 1638

gcc的基本用法

命令格式:gcc [選項] [檔名]

編譯的四個階段:

-e:僅執行編譯預處理; 

-c:僅執行編譯操作,不進行連線操作;

-s:將c**轉換為彙編**; 

-o:指定生成的輸出檔案。

–c是使用gnu彙編器將原始檔轉化為目標**之後就結束,在這種情況下,只呼叫了c編譯器(ccl)和彙編器(as),而聯結器(ld)並沒有被執行,所以輸出的目標檔案不會包含作為linux程式在被裝載和執行時所必須的包含資訊,但它可以在以後被連線到乙個程式

-c表示只編譯(compile),而不連線成為可執行檔案。生成同名字的 .o 目標檔案。通常用於編譯不包含主程式的子程式檔案。

gcc -c hello.c

生成:hello.o

-o選項用於說明輸出(output)檔名,gcc將生成乙個目標(object)檔案xx。

gcc hello.c -o xqf

或者:gcc -o xqf hello.c(順序可以調換)

輸出:xqf 為程式可執行檔案

-g 選項產生符號除錯工具(gnu的gdb)所必要的符號資訊,插入到生成的二進位制**中。表示編譯debug版本。

想要對源**進行除錯,就必須加入這個選項。當然,會增加可執行檔案的大小。

gcc study.c -o xqf

gcc -g study.c -o xqf_g

結果如下:(確實加了 -g 可執行檔案後變大了一點)

-rwxr-xr-x 1 root root 12393 apr 19 21:39 xqf_g

-rwxr-xr-x 1 root root 11817 apr 19 20:48 xqf

gcc 在產生除錯符號時,同樣採用了分級的思路,開發人員可以通過在 -g 選項後附加數字1、2、3指定在**中加入除錯資訊的多少。預設的級別是2(-g2),此時產生的除錯資訊包括:擴充套件的符號表、行號、區域性或外部變數資訊。

級別3(-g3)包含級別2中的所有除錯資訊以及源**中定義的巨集。

級別1(-g1)不包含區域性變數和與行號有關的除錯資訊,因此只能夠用於回溯跟蹤和堆疊轉儲。

回溯追蹤:指的是監視程式在執行過程中函式呼叫歷史。

堆疊轉儲:則是一種以原始的十六進製制格式儲存程式執行環境的方法。

-pedantic 選項:當gcc在編譯不符合ansi/iso c 語言標準的源**時,將產生相應的警告資訊

[objc]view plain

copy

#include 

intmain()    

gcc -pedantic -o mm study.c 

study.c: in function 『main』:

study.c:5: warning: iso c90 does not support 『long long』

-wall選項:使gcc產生盡可能多的警告資訊,警告資訊很有可能是錯誤的**,特別是隱式程式設計錯誤,所以盡量保持0 warning。

用上面的**:study.c,編譯如下

gcc -wall -o he study.c 

study.c: in function 『main』:

study.c:5: warning: unused variable 『var』

-werror 選項:要求gcc將所有的警告當作錯誤進行處理。

同樣是上面的程式:study.c

gcc -werror -o haha study.c

竟然沒有錯誤!! 

改一下study.c

#include

[objc]view plain

copy

void

main()    

再編譯:

gcc -werror -o haha study.c

cc1: warnings being treated as errors

study.c: in function 『main』:

study.c:4: error: return type of 『main』 is not 『int』

gcc -wall -o hehe study.c

study.c:3: warning: return type of 『main』 is not 『int』

study.c: in function 『main』:

study.c:5: warning: unused variable 『var』

所以說:並不是所有的warning都變成 error。具體的,後面再深究。

-fpic選項。pic指position independent code。共享庫要求有此選項,以便實現動態連線(dynamic linking)。

-i 選項(大寫的 i):向標頭檔案搜尋目錄中新增新的目錄。

1、用#include"file"的時候,gcc/g++會先在當前目錄查詢你所制定的標頭檔案,如

果沒有找到,他回到預設的頭檔案目錄找。

如果使用-i制定了目錄,他會先在你所制定的目錄查詢,然後再按常規的順序去找.

2、用#include,gcc/g++會到-i制定的目錄查詢,查詢不到,然後將到系統的缺

省的頭檔案目錄查詢

例如:gcc –i /usr/dev/mysql/include test.c –o test.o

-l選項(小寫的 l)說明庫檔案的名字。如果庫檔案為 libtest.so, 則選項為: -ltest

-l選項說明庫檔案所在的路徑。

例如:-l.(「.」表示當前路徑)。

-l/usr/lib (「/usr/lib」 為路徑。注:這裡的路徑是絕對路徑)

如果沒有提供 -l選項,gcc 將在預設庫檔案路徑下搜尋

-shared選項指定生成動態連線庫,不用該標誌外部程式無法連線。相當於乙個可執行檔案, 生成 .so 檔案

-static 選項,強制使用靜態鏈結庫,生成 .a 檔案。因為gcc在鏈結時優先選擇動態鏈結庫,只有當動態鏈結庫不存在時才使用靜態鏈結庫。加上該選項可強制使用靜態鏈結庫。

.so 和 .a 的區別:執行時動態載入,編譯時靜態載入

多個檔案一起編譯:

檔案:test_a.c  test_b.c

兩種編譯方法:

1、一起編譯

gcc test_a.c test_b.c -o test

2、分別編譯各個原始檔,之後對編譯後輸出的目標檔案鏈結

gcc -c test_a.c

gcc -c test_b.c

gcc -o test_a.o test_b.o -o test

比較:第一中方法編譯時需要所有檔案重新編譯;第二種植重新編譯修改的檔案,未修改的不用重新編譯

GCC編譯過程及基本用法

gcc是有gnu開發的程式語言編譯器。使用gcc編譯器,目的大多都是將源 編譯成可執行檔案。但是在這看似簡單的一步,實則經過了預處理 preprocessing 編譯 compilation 彙編 assembly 和鏈結 linking 四個步驟 步驟命令引數 預處理 e 編譯 s 彙編 c 1 ...

GCC基本用法

初學時最好從命令列入手,這樣可以熟悉從編寫程式 編譯 除錯和執行的整個過程。編寫程式可以用vi或其它編輯器編寫。編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多...

gcc基本用法

gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多而打擊了學習的信心。一.常用編譯命令選項 假設源程式檔名為test.c。1.無選項編譯鏈結 用法 gcc test.c 2.選項 o 用法 gcc test.c o test...