gcc編譯器的介紹及使用基礎

2021-06-22 19:38:10 字數 2660 閱讀 5229

gcc則通過字尾來區別輸入檔案的類別,下面我們來介紹gcc所遵循的部分約定規則。

.c為字尾的檔案,c語言源**檔案;

.a為字尾的檔案,是由目標檔案構成的檔案庫檔案;

.c,.cc或.cxx 為字尾的檔案,是c++源**檔案;

.h為字尾的檔案,是程式所包含的標頭檔案;

.i 為字尾的檔案,是已經預處理過的c源**檔案;

.ii為字尾的檔案,是已經預處理過的c++源**檔案;

.m為字尾的檔案,是objective-c源**檔案;

.o為字尾的檔案,是編譯後的目標檔案;

.s為字尾的檔案,是組合語言源**檔案;

.s為字尾的檔案,是經過預編譯的組合語言源**檔案。

一、編譯過程

使用gcc編譯程式時,編譯過程可被細分為四個階段:

(1)預處理(也稱預編譯,preprocessing)

(2)編譯(compilation)、

(3)彙編彙編(assembly)

(4)鏈結 (linking)。

1、預處理:

預處理階段,編譯器將**中的stdio.h的**編譯進來,使用者使用-e選項進行檢視

gcc -e hello.c -o hello.i

2、編譯:

gcc首先檢查語法的規範性以及是否有語法錯誤等,以確定**實際要做的工作,在檢查無誤後,gcc把**編譯成組合語言。

gcc -s hello.i -o hello.s

3、彙編

把編譯生成的.s檔案轉換成目標檔案

gcc -c hello.s -o hello.o

4、鏈結

在該階段,在這裡涉及乙個重要的概念:函式庫。在這個程式中並沒有定義「printf"的函式實現,在預編譯中包含進的「stdio.h」中也只有該函式的宣告,而沒有定義函式的實現,那麼,是在**實現「printf"函式的呢?

最後的答案是:系統把這些函式實現都己經被放入名為libc. so.6的庫檔案中去了,在沒有特別指定時庫函式中去,gcc會到系統預設的搜尋路徑「/usr/iib」下進行查詢,也就是鏈結到libc.so.6這 樣就能實現函式「printf"了,而這也就是鏈結的作用。

gcc  hello.o –o hello

初學時最好從命令列入手,這樣可以熟悉從編寫程式、編譯、除錯和執行的整個過程。編寫程式可以用vi或其它編輯器編寫。

編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。

gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多而打擊了學習的信心。

一. 常用編譯命令選項  

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

1. 無選項編譯鏈結

用法:#gcc test.c

2. 選項 -o

用法:#gcc test.c -o test

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

7. 選項-o

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

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

-o2,比-o更好的優化

編譯、鏈結,當然整個編譯、鏈結過程會更慢。

7. 選項-g

gcc -g產生符號除錯工具(gnu的gdb)所必要的符號資訊,要想對源**進行除錯,我們就必須加入這個選項。

8-idirname,將dirname所指出的目錄加入到程式頭檔案目錄列表中,是在預編譯過程中使用的引數。c程式中的標頭檔案包含兩種情況∶

a)#include

b)#include "myinc.h"

其中,a類使用尖括號(),b類使用雙引號(「 」)。對於a類,預處理程式cpp在系統預設包含檔案目錄(如/usr/include)中搜尋相應的檔案,

而對於b類,cpp在當前目錄中搜尋標頭檔案,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的檔案,

就到指定的dirname目錄中去尋找。在程式設計中,如果我們需要的這種包含檔案分別分布在不同的目錄中,

就需要逐個使用-i選項給出搜尋路徑。

-ldirname,將dirname所指出的目錄加入到程式函式檔案庫檔案的目錄列表中,是在連線過程中使用的引數。在預設狀態下,連線程式ld 在系統的預設路徑中(如/usr/lib)尋找所需要的檔案庫檔案,這個選項告訴連線程式,首先到-l指定的目錄中去尋找,然後到系統預設路徑中尋找,如 果函式庫存放在多個目錄下,就需要依次使用這個選項,給出相應的存放目錄。

-lname,在連線時,裝載名字為「libname.a」的函式庫,該函式庫位於系統預設的目錄或者由-l選項確定的目錄下。

例如,-lm表示連線名為「libm.a」的數學函式庫。

例如hello.c

#include

void main(void)

GCC編譯器的使用

看下面的例子 test.c include main char str i like linux i advices you jion in the linux world printf s n str exit 0 使用gcc編譯 輸入gcc c test.c得到目標檔案test.o。c命令表示對...

GCC編譯器的使用

看下面的例子 test.c include main char str i like linux i advices you jion in the linux world printf s n str exit 0 使用gcc編譯 輸入gcc c test.c得到目標檔案test.o。c命令表示對...

GCC編譯器的使用

看下面的例子 test.c include main char str i like linux i advices you jion in the linux world printf s n str exit 0 使用gcc編譯 輸入gcc c test.c得到目標檔案test.o。c命令表示對...