c語言複習之連結過程簡介
本文是基於唐佐林老師的課程的總結
工程中的每個c語言原始檔被編譯後生產目標檔案,這些目標檔案如何生成最終的可執行檔案?
聯結器的主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確的銜接
圖1
靜態連結
-由連結器在連結時將庫的內容直接加入到可執行程式中
圖2
LINUX下靜態庫的建立和使用
-編譯靜態庫原始碼:gcc -c lib.c -o lib.o
-生產靜態庫檔案:ar -q lib.a lib.o
-使用靜態庫編譯:gcc main.c lib.a -o main.out
這裡是建立一個靜態庫
圖3
圖4
如圖3和圖4表示那樣,我們將外部的slib.o、slib.c和dlib.c 刪除掉,結果還是一樣,由此我們可以得出結論,靜態連結就是將所有的庫檔案生成的庫檔案全部封裝到a.out裡面去了。
動態連結
-可執行程式在執行時才動態載入庫進行連結
-庫的內容不會進入可執行檔案程式當中
圖5
LINUX下動態庫的建立和使用
-編譯動態庫原始碼:gcc -shared dlib.c -o dlib.so
-使用動態庫編譯:gcc -main.c -ldl -o main.out
- 關鍵系統呼叫
(1)dlopen : 開啟動態庫檔案
(2)dlsym : 查詢動態庫中的函式並返回呼叫地址
(3)dlclose : 關閉動態庫檔案
圖6
dlopen是linux c的內容,大家對出現看不懂的話,推薦大家看一本書叫uinx環境高階程式設計。dlopen可以開啟dlib.so的過程,就是將dlib.so載入到記憶體中。pdlib這個指標就指向那個動態庫dlib.so,然後定義兩個函式指標,然後判斷pdlib指標是否為空,不為空的話,就證明動態庫載入成功了,dlsym查詢動態庫dlib.so中的函式name,下一個如上,然後下面再判斷是否真的找到兩個函式,找到之後就呼叫函式。
圖6
生成動態庫dlib.so ps:這張圖裡面有一個錯誤,應該生成dlib.so
圖7
編譯程式要指明是動態連結,要不然程式會找不到相應的程式
圖7
如圖7,這是最後的結果
圖8
如圖8,將庫檔案刪除後,就打不開庫檔案,說明一個問題,動態連結就是程式執行時,將庫檔案連結到程式當中。因此動態連結依賴動態庫。
連結是指將目標檔案最終連結到可執行程式
根據連結方式的不同,連結過程可以分為:
-靜態連結:目標檔案直接連結進入可執行程式
-動態連結:在程式啟動後才動態載入目標檔案
應用:動態連結可以部分更新程式,方便升級
靜態連結適用於一些小程式,放在任何機器上都可以自由的執行