linux入門筆記GCC編譯器

2021-08-09 15:53:23 字數 3956 閱讀 5234

gcc編譯器能將c、c++語言源程式、匯程式設計序和目標程式編譯、連線成可執行檔案,如果沒有給出可執行檔案的名字,gcc將生成乙個名為a.out的檔案

副檔名         文 件 類 型          後續編譯流程

.c c語言源**檔案 預處理、編譯、彙編、鏈結

.c/.cc/.cxx c++源**檔案 預處理、編譯、彙編、鏈結

.i 已經預處理過的c源**檔案 編譯、彙編、鏈結

.ii 已經預處理過的c++源**檔案 編譯、彙編、鏈結

.s 組合語言源**檔案 彙編、鏈結

.s 經過預編譯的組合語言源**檔案 彙編、鏈結

.a 由目標檔案構成的檔案庫檔案 鏈結

.o 編譯後的目標檔案 鏈結

.h 程式所包含的標頭檔案

編譯過程分為四個階段

預處理(pre-processing)

編譯(compiling)

彙編(assembling)

鏈結(linking)

基本語法格式:

gcc [選項] 原始檔 [選項] [目標檔案]

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...