一 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檔案內容...