1. 程式人生 > >ubuntu gcc 安裝 使用

ubuntu gcc 安裝 使用

                           “人多不足以依賴,要生存只有靠自己。”

gcc是什麼:--------------------------

Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、效能優越的多平臺編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺上編譯出可執行程式的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。

Gcc編譯器能將C、C++語言源程式編譯、連線成可執行檔案,如果沒有給出可執行檔案的名字,gcc將生成一個名為a.out的檔案。在Linux系統中,可執行檔案沒有統一的字尾,系統從檔案的屬性來區分可執行檔案和不可執行檔案。

Ubuntu下安裝GCC和其他一些Linux系統有點不一樣):-----------------

方法1: sudo apt-get  build-dep  gcc 

方法2: sudo apt-get  install  build-essential 

( linux作業系統上面開發程式, 光有了gcc 是不行的,它還需要一個   build-essential軟體包,作用是提供編譯程式必須軟體包的列表資訊,也就是說 編譯程式有了這個軟體包,它才知道 標頭檔案在哪 才知道庫函式在哪。)

安裝完了可以執行如下的命令來檢視版本:gcc --version 

Gcc的執行過程---------------------------------------

用gcc由C語言原始碼檔案生成可執行檔案的過程經歷四個相互關聯的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、彙編(Assembly)和連線(Linking)。●預處理:命令gcc首先呼叫cpp進行預處理,在預處理過程中,對原始碼檔案中的檔案包含(include)、預編譯語句(如巨集定義define等)進行分析。前處理器cpp根據以字元開頭#開頭的命令,修改原始C程式。比如xx.c中的第一行為 #include <stdio.h>,前處理器便將stdio.h的內容直接插入到程式中●編譯階段:接著呼叫cc1進行編譯,編譯器ccl 將文字檔案xx.i 翻譯為彙編程式碼xx.s。組合語言是非常有用的,因為它將不同高階語言的不同編譯器提供了通用的輸出語言。例如,C和Fortran 的在此步編譯產生的輸出檔案都是一樣的組合語言。
●彙編階段:彙編器as 將xx.s 翻譯成機器語言, 儲存在xx.o 中。這是個二進位制檔案.
●連結階段:當所有的目標檔案都生成之後,gcc就呼叫ld來完成最後的連結,所有的目標檔案被安排在可執行程式中的恰當的位置,同時,該程式所呼叫到的庫函式也從各自所在的檔案庫中連到合適的地方,這些連結檔案一般是靜態庫和動態庫。例如,hello程式呼叫了printf 函式,這個函式是標準C庫中的一個函式,它被儲存在一個名為printf.o 的檔案中,這個檔案必須以某種方式合併到我們的hello.o的程式中。 最終,得到hello 可執行檔案,可以被載入到記憶體中由系統執行

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檔案。彙編的作用主要是將程式碼轉化成系統認識的機器指令,然後生成“.o”目標檔案。
6) 無選項鍊接
用法:#gcc test.o -o test
作用:將編譯輸出檔案test.o連結成最終可執行檔案test。
7) 選項 -O
用法:#gcc -O1 test.c -o test
作用:使用編譯優化級別1編譯程式。級別為1~3,級別越大優化效果越好,但編譯時間越長。

gcc多原始檔的編譯方法

如果有多個原始檔,基本上有兩種編譯方法:[假設有兩個原始檔為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 -o testfun.o test.o -o test //將testfun.o和test.o連結成test

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

gcc所遵循的部分約定規則---------------------------------gcc則通過後綴來區別輸入檔案的類別:.c為字尾的檔案,C語言原始碼檔案;

.C或.cc或.cxx為字尾的檔案,是C++原始碼檔案;

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

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

.i為字尾的檔案,是已經預處理過的C原始碼檔案;.ii為字尾的檔案,是已經預處理過的C++原始碼檔案;.o為字尾的檔案,是編譯後的目標檔案;.s為字尾的檔案,是組合語言原始碼檔案;.S為字尾的檔案,是經過預編譯的組合語言原始碼檔案。.m為字尾的檔案,是Objective-C原始碼檔案;其他gcc編譯選項:------------------------------------------------------------g,產生符號除錯工具(GNU的gdb)所必要的符號資訊,要想對原始碼進行除錯,我們就必須加入這個選項。-O,對程式進行優化編譯、連線,採用這個選項,整個原始碼會在編譯、連線過程中進行優化處理,這樣產生的可執行檔案的執行效率可以提高,但是,編譯、連線的速度就相應地要慢一些。-O2,比-O更好的優化編譯、連線,當然整個編譯、連線過程會更慢。
-Idirname,將dirname所指出的目錄加入到程式標頭檔案目錄列表中,是在預編譯過程中使用的引數

REF:

《Computer Systems: A Programmer's Perspective》