天天看點

11、GCC的基本使用

一. 常用編譯指令選項   

假設源程式檔案名為test.c。

1. 無選項編譯連結

用法:#gcc test.c

作用:将test.c預處理、彙編、編譯并連結形成可執行檔案。這裡未指定輸出檔案,預設輸出為a.out。

2. 選項 -o

用法:#gcc test.c -o test

作用:将test.c預處理、彙編、編譯并連結形成可執行檔案test。-o選項用來指定輸出檔案的檔案名。

3. 選項 -E

用法:#gcc -E test.c -o test.i

作用:将test.c預處理輸出test.i檔案。

4. 選項 -S

用法:#gcc -S test.i

作用:将預處理輸出檔案test.i彙編成test.s檔案。

5. 選項 -c

用法:#gcc -c test.s

作用:将彙編輸出檔案test.s編譯輸出test.o檔案。

6. 無選項連結

用法:#gcc test.o -o test

作用:将編譯輸出檔案test.o連結成最終可執行檔案test。

7. 選項-O

用法:#gcc -O1 test.c -o test

作用:使用編譯優化級别1編譯程式。級别為1~3,級别越大優化效果越好,但編譯時間越長。

二. 多源檔案的編譯方法

如果有多個源檔案,基本上有兩種編譯方法:

[假設有兩個源檔案為test.c和testfun.c]

1. 多個檔案一起編譯

用法:#gcc testfun.c test.c -o test

作用:将testfun.c和test.c分别編譯後連結成test可執行檔案。

2. 分别編譯各個源檔案,之後對編譯後輸出的目标檔案連結。

用法:

#gcc -c testfun.c //将testfun.c編譯成testfun.o

#gcc -c test.c //将test.c編譯成test.o

#gcc testfun.o test.o -o test //将testfun.o和test.o連結成test

    以上兩種方法相比較,第一中方法編譯時需要所有檔案重新編譯,而第二種方法可以隻重新編譯修改的檔案,未修改的檔案不用重新編譯。

三、gcc程式設計環境基礎--編譯時頭檔案和庫檔案路徑指定

※預處理(preprocessing),編譯(compilation),彙編(assembly)和連接配接(linking)

※include的header檔案,連結資料庫,系統定義,總共有下列來源指定gcc去那找:

當初在編譯時指定的(在~gcc/gcc/collect2.c:locatelib()

寫在specs内的

後來用-D -I -L指定的

gcc環境變量設定(編譯的時候)

ld.so的環境變量(這是run time的時候)

1.頭檔案

gcc在編譯時怎麼去尋找所需要的頭檔案 :

※header file的搜尋會從-I開始

※然後找gcc的環境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

※再找内定目錄

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include/g++-3

/usr/lib/gcc-lib/i386-linux/2.95.2/i386-linux/include

2.庫檔案

cos()等函式庫的選項要多加 -lm

編譯的時候:

※gcc會去找-L

※再找gcc的環境變量LIBRARY_PATH

※再找内定目錄 /lib /usr/lib /usr/local/lib

3.利用Linux系統上已有的研發庫

(1).檢視庫檔案提供了哪些調用

能用nm指令自己檢視庫檔案提供了哪些調用

(2).通過頭檔案檢視函數的定義

Wc -l 檢視檔案的内容

    Gcc 預編譯技術首先将頭檔案解析成臨時檔案,在某個源代碼檔案需要時,再讀入該臨時檔案。可以用g++單獨編譯一個頭檔案。

    編譯階段主要進行源代碼的完整性檢測,然後将代碼翻譯成彙編語言,而彙編階段主要進行彙編代碼向目标代碼的翻譯。

4.函數庫分為:

靜态庫:後辍一般為.a。

動态庫:共享庫,.so(share object),一般格式為*.so.x,x為版本。