1. 程式人生 > >c語言複習之連結過程簡介

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,將庫檔案刪除後,就打不開庫檔案,說明一個問題,動態連結就是程式執行時,將庫檔案連結到程式當中。因此動態連結依賴動態庫。

連結是指將目標檔案最終連結到可執行程式

根據連結方式的不同,連結過程可以分為:

                     -靜態連結:目標檔案直接連結進入可執行程式

                     -動態連結:在程式啟動後才動態載入目標檔案

應用:動態連結可以部分更新程式,方便升級

          靜態連結適用於一些小程式,放在任何機器上都可以自由的執行