Linux下GCC編譯過程及靜態鏈結庫和動態鏈結庫

2021-09-12 20:56:29 字數 2432 閱讀 1829

一 gcc編譯過程 

我們知道gcc是乙個強大的編譯器,很多linux下的gnu工具都是用c語言寫的,並且用gcc編譯的,那麼gcc的編譯過程是怎樣的呢,先來看乙個總的流程圖,我自己簡單畫的,湊合著看 

1首先是原始檔經過預載入變成了.i結尾的檔案,可以通過-e這個引數來生成這個中間檔案,這裡主要是把一些include的標頭檔案和一些巨集定義,放到原始檔中。 

2從預載入的檔案經過編譯就會變成組合語言的檔案,這一步可以通過-s這個引數來生成這個中間檔案 

3從組合語言的檔案通過彙編,就會變成目標**.o的檔案,這一步可以通過-c這個引數來生成這個中間檔案 

4最後經過鏈結,生成最終的可執行檔案 

可能這樣說比較難懂,我們通過乙個例子來說明下: 

我新建了乙個hello.c的檔案 

然後我先生成.i結尾的預載入檔案 

我們看到這個檔案生成了,我們看一下這個檔案的內容 

大家會發現這個檔案的內容非常多,但是最後是我們本來的**,上面的**都是標頭檔案和一些巨集的內容,全載入進來了 

下面我們通過編譯生成彙編檔案.s 

然後我們看一下這個hello.s 

看到了我們熟悉的組合語言 

我們繼續,經過彙編器,生成.o的目標檔案 

依然來看下內容 

看到了一堆二進位制的感覺 

最後通過鏈結器,生成可執行檔案 

gcc hello.o -o hello 

然後執行 

當然如果你不想做這麼多步驟,直接gcc hello.c -o hello即可完成上面所有的步驟了。

二 靜態鏈結庫和動態鏈結庫 

靜態鏈結庫就是在程式編譯的時候就被載入進來,這樣的可執行檔案會比較大一些,還不能共享 

動態鏈結庫是在程式執行的時候載入,可共享 

看下面乙個例子 

現在有這麼三個檔案 

如果直接編譯hello.c肯定會報錯,因為這裡沒有main函式,那麼我們該怎麼處理呢 

1 都編譯成.o檔案,然後鏈結,生成可執行檔案 

2 利用靜態鏈結庫 

在linux下,庫檔案一般放在/usr/lib和/lib下, 

靜態庫的名字一般為lib***x.a,其中***x是該lib的名稱 

動態庫的名字一般為lib***x.so.major.minor,***x是該lib的名稱,major是主版本號, minor是副版本號 

靜態庫的字尾是.a,它的產生分兩步 

由原始檔編譯生成一堆.o,每個.o裡都包含這個編譯單元的符號表 

ar命令將很多.o轉換成.a,成為靜態庫 

ar rcs libmyhello.a hello.o 

注意,gcc會在靜態庫名前加上字首lib,然後追加副檔名.a得到的靜態庫檔名來查詢靜態庫檔案,因此,我們在寫需要連線的庫時,只寫名字就可以,如libmyhello.a的庫,只寫:-lmyhello 

gcc -o hello main.c -static -l. -lmyhello 

-static代表使用靜態鏈結庫,-l.代表靜態鏈結庫搜尋路徑 .代表當前路徑

3 動態鏈結庫 

gcc -shared -fpic -c hello.c 

gcc -shared -fpic -o libmyhello.so hello.o

Linux下gcc編譯過程例項講解

本次講解基於c 在ubuntu下編譯一段例項 詳細講解gcc的編譯過程。通過本教程,你將掌握linux下gcc編譯過程和原理。詳見我的部落格 linux下c c 編譯原理及過程 file main.c brief 測試 author zyf date 2020 12 09 23 28 20 vers...

gcc簡介及編譯過程

1 編譯器 gcc 簡介 linux系統下的 gcc gnu c compiler 是gnu推出的功能強大 效能優越的多 平台編譯器,它是gnu的代表作品之一,gcc是可以在多種硬體平台上編譯出可 執行檔案的超級編譯器,其執行效率比一般的編譯器要高出20 30 編譯器能 將c c 語言源程式 組合語...

GCC 的編譯過程及編譯工具

nasm的安裝與使用 總結本文講解了gcc的編譯過程,預處理 編譯 彙編和連線。還有編譯工具nasm的使用。include intmain void 預處理語句 gcc e hello.c o hello.ihello.i檔案內容 gcc s hello.i o hello.shello.s檔案內容...