UNIX 動態庫和靜態庫

2021-06-11 17:39:10 字數 1442 閱讀 6867

動態庫,又叫做共享物件庫,以.so結尾。使用動態庫時,編譯器並不直接在編譯的時候將**嵌入到目標檔案中,而是等到執行時呼叫相應的函式,才載入**。

靜態庫,又叫做歸檔檔案,以.a結尾。使用靜態庫的時候,編譯器在編譯過程中直接將**嵌入到目標檔案中,所以一旦完成編譯,那麼靜態庫可以不需要了。

1、編寫靜態庫以及使用靜態庫

首先編寫hello.h檔案。

然後編寫hello.c檔案。

然後編寫main.c。

我們使用gcc -c hello.c得到二進位制目標檔案hello.o,然後使用ar命令生成靜態鏈結庫libhello.a。

ar -cru libhello.a hello.o

指定鏈結庫對main.c進行編譯鏈結生成可執行檔案main.out

gcc -o main.out -l. -lhello main.c

執行main.out檔案得到結果:

這樣就完成從編寫靜態鏈結庫到使用靜態庫的全部過程。

2、編寫動態庫並且使用動態庫

現在我們來完成動態鏈結庫的編寫。

還是上面的hello.h hello.c main.c檔案,我們生成動態鏈結庫libhello.so。

使用命令gcc -c hello.c -fpic生成hello.o目標檔案,使用gcc -shared將hello.o加入到動態庫libhello.so中,

gcc -shared hello.o -o libhello.so

編譯鏈結main.c

gcc main.c -o main.out -l. -lhello

配置ld_library_path的內容包含當前目錄:export ld_library_path=$ld_library_path:.

執行main.out得到下面的運**況。

三、程式中顯式載入動態庫

還是按照前面的步驟,生成動態庫libhello.so,然後在main.c程式中顯式的載入動態庫,具體見**:

使用gcc -ldl main.c -o main.out生成可執行程式。執行main.out的時候也需要尋找動態庫的路徑中包含當前目錄,也就是同樣使用export ld_library_path=.。然後執行可執行程式得到的結果與2中的結果相同。

動態庫和靜態庫

本文主要解決以下幾個問題 1 為什麼要使用庫?2 庫的分類 3 建立自己的庫 或許大家對自己初學linux時的情形仍記憶尤新吧。如果沒有乙個能較好的解決依賴關係的包管理器,在linux下安裝軟體將是一件及其痛苦的工作。你裝a包時,可能會提示你要先裝b包,當你費盡心力找到b包時,可能又會提示你要先安裝...

動態庫和靜態庫

先抄一段 windows下的動態庫和靜態庫區別解釋,其實linux下意義一樣的,不過字尾名有些區別 靜態庫 在編譯的時候載入生成目標檔案,在執行時不用載入庫,在執行時對庫沒有依賴性。動態庫 在目標檔案執行時載入,手動載入,且對庫有依賴性。兩者區別 一,靜態庫的使用需要 1 包含乙個對應的標頭檔案告知...

動態庫和靜態庫

簡單的說,使用動態庫就是在鏈結的時候,不會將動態庫的 鏈結到可執行檔案中,而是採用symbol的方式。使用靜態庫,生成可執行檔案的時候,會將靜態庫的 鏈結到可執行檔案中。這樣,動態庫體積會很小,並且可以,依賴於更新的動態庫,但是,缺點是不穩定。靜態庫會更加穩定,但是體積會很大。靜態庫 就是多個目標檔...