gcc編譯器能將c、c++語言源程式、匯程式設計序和目標程式編譯、連線成可執行檔案,如果沒有給出可執行檔案的名字,gcc將生成乙個名為a.out的檔案
副檔名 文 件 類 型 後續編譯流程
.c c語言源**檔案 預處理、編譯、彙編、鏈結
.c/.cc/.cxx c++源**檔案 預處理、編譯、彙編、鏈結
.i 已經預處理過的c源**檔案 編譯、彙編、鏈結
.ii 已經預處理過的c++源**檔案 編譯、彙編、鏈結
.s 組合語言源**檔案 彙編、鏈結
.s 經過預編譯的組合語言源**檔案 彙編、鏈結
.a 由目標檔案構成的檔案庫檔案 鏈結
.o 編譯後的目標檔案 鏈結
.h 程式所包含的標頭檔案
編譯過程分為四個階段gcc編譯例項預處理(pre-processing)
編譯(compiling)
彙編(assembling)
鏈結(linking)
基本語法格式:
gcc [選項] 原始檔 [選項] [目標檔案]
hello.c
#include
int main()
**預處理階段**
[root@vm-dev myprg]#gcc -e hello.c -o hello.i
「-e」 指定只進行預處理
「hello.c」是源程式檔案
「-o」指定生成目標檔案
「hello.i」是預處理過程生成的目標檔案
**編譯階段**
[root@vm-dev myprg]#gcc -s hello.i -o hello.s
「-s」指定只進行到編譯階段
「hello.i」是進行編譯的原始檔
「-o」指定生成目標檔案
「hello.s」是編譯生成的目標檔名
**彙編階段**
[root@vm-dev myprg]#gcc -c hello.s -o hello.o
「-c」指定只進行到彙編階段結束為止
「hello.s」是進行彙編的原始檔
「-o」指定生成目標檔案
「hello.o」是編譯生成的目標檔名。hello.o為二進位制目標**檔案
**鏈結階段**
在成功編譯之後,就進入了鏈結階段。在這裡涉及到乙個重要的概念:函式庫。舉例:在目標檔案hello.o中沒有定義「printf」的函式實現,且在預編譯中包含進的「stdio.h」中也只有該函式的宣告,而沒有定義函式的實現,系統把這些函式實現都被做到名為libc.so.6的庫檔案中去了,在沒有特別指定時,gcc 會到系統預設的搜尋路徑「/usr/lib」下進行查詢,也就是鏈結到libc.so.6庫函式中去,這樣就能實現函式「printf」了,而這也就是鏈結的作用。
**可執行檔案生成階段**
[root@vm-dev myprg]#gcc hello.o -o hello
該命令gcc之後無選項引數,表示對指定的原始檔進行編譯,直到輸出執行檔案(示例中的原始檔為hello.o,輸出的執行檔案hello)。
執行該可執行檔案
[root@vm-dev myprg]#./hello
**多個原始檔編譯**
[root@vm-dev myprg]#gcc foo1.c foo2.c -o foo
[root@vm-dev myprg]#gcc -c foo1.c -o foo1.o
[root@vm-dev myprg]#gcc -c foo2.c -o foo2.o
[root@vm-dev myprg]#gcc foo1.o foo2.o -o foo
gcc編譯選項彙總
-e 只進行預編譯,不做其他處理;-o 指定編譯的輸出檔案;
-s 只編譯到彙編階段,生成彙編**;
-c 只編譯到鏈結階段,生成目標檔案「.o」;
-g 在可執行程式中包含標準除錯資訊;
-v 列印出編譯器內部編譯各過程的命令列資訊和編譯器的版本;
-i dir 在標頭檔案的搜尋路徑列表中新增dir目錄;
-l dir 在庫檔案的搜尋路徑列表中新增dir目錄;
-static 鏈結靜態庫;
-l lib 連線名為lib的庫檔案。
靜態庫和動態庫函式庫——靜態庫建立和使用靜態庫是指編譯鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不再需要庫檔案了。其字尾名一般為「.a」。
動態庫與之相反,在編譯鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時執行鏈結檔案載入庫,這樣可以節省系統的開銷。動態庫一般字尾名為「.so」,如前面所述的libc.so.6就是動態庫。gcc在編譯時預設使用動態庫。
***靜態庫的建立***
靜態庫建立步驟一
編輯原始檔libhello.h
#ifndef _libhello_h_
#define _libhello_h_
void print_hello(void);
#endif
編輯原始檔libhello.c
#include
void print_hello(void)
靜態庫建立步驟二
生成目標檔案libhello.o
$gcc –c libhello.c –o libhello.o
靜態庫建立步驟三
使用ar命令建立靜態庫libhello.a
$ar –rc libhello.a libhello.o
$file libhello.a
**靜態庫的使用**
usehello.c
#include 「libhello.h」
int main(void)
編輯測試檔案usehello.c
生成可執行檔案usehello_static
$gcc –o usehello_static usehello.c libhello.a
執行$./usehello_static
函式庫——動態庫使用和建立
**動態庫的建立**
編輯原始檔libhello.h,libhello.c
生成共享庫目標檔案libhello.o
$gcc –fpic –wall –g –c libhello.c –o libhello.o
編譯共享庫libhello.so
.1.0
$gcc –g –shared –w1,-soname,libhello.so –o libhello.so
.1.0 libhello.o
$file libhello.so
.1.0
建立共享庫的符號連線
$ln –s libhello.so
.1.0 libhello.so
**動態庫的使用**
編輯測試檔案usehello.c
生成可執行檔案usehello_dy
$gcc –g –o usehello_dy usehello.c –lhello –l ./
執行$ld_library_path=$(pwd) ./usehello_dy
Linux 安裝gcc編譯器
總結一下自己的學習經驗,學習時發現linux沒有安裝gcc,方式一 yum install gcc c 前提是可以聯網 方式二 進入linux桌面,找到 rpm ivh cpp 4.1.2 48.e15.i386.rpm 回車 rpm ivh kernel headers 2.6.18 194.el...
Linux 編譯器之 GCC
編輯器是指我用它來寫程式的 編輯 而我們寫的 語句,電腦是不懂的,我們需要把它轉成電腦能懂的語句,編譯器就是這樣的轉化工具。就是說,我們用編輯器編寫程式,由編譯器編譯後才可以執行!gcc gnu compiler collection,gnu 編譯器套件 是由gnu開發的程式語言編譯器。gcc 原本...
Linux入門gcc編譯器的使用簡易介紹
gcc 編譯器的使用 gcc 選項 引數 o 指定生成的輸出檔案 e 僅執行編譯預處理 s 將c 轉換為彙編 wall 顯示警告資訊 c 僅執行編譯操作,不進行連線操作。set set ts 4 設定tab的鍵入大小 v shift shift x 複製 p 貼上多個檔案一起編譯 gcc testf...