Linux下的靜態庫與動態庫使用詳解

2021-09-17 20:00:30 字數 2403 閱讀 3766

庫是已經寫好的成熟的可以供人們復用的**。作業系統暴露了自己的部分介面供我們使用,但是由於介面太複雜,有心的

開發者就將這些系統呼叫介面進行了二次封裝形成了庫,這對於我們小白來說方便了很多。

1.什麼是靜態庫

程式在鏈結的時候把彙編生成的二進位制目標檔案(.o)與庫的**一起鏈結打包到可執行檔案中,程式執行的時候將不再需要靜態庫 。這樣的鏈結方式叫做靜態鏈結。

既然靜態庫是和彙編生成的.o檔案一起鏈結到可執行檔案中,那麼靜態庫或許也是.o檔案?事實正是如此,靜態庫是很多目標檔案的組合。

2.如何使用靜態庫?

舉乙個加減法的例子:

add.h**:

#ifndef __add_h__

#define __add_h__

int add(int a,int b);

#endif

add.c**:

#include"add.h"

int add(int a,int b)

sub.h**:

#ifndef __sub_h__

#define __sub_h__

int sub(int a,int b);

#endif

sub.c**:

#include"sub.h"

int sub(int a,int b)

main.c**:

#include #include "add.h"

#include "sub.h"

int main()

●建立靜態庫:

1>將**編譯成目標檔案.o。(注意要帶引數-c)

2>通過ar歸檔工具打包成.a靜態庫檔案。

●使用靜態庫

linux下使用靜態庫,只需要在編譯時指定庫的搜尋路徑和庫的名稱。

-l:指定的搜尋路徑。

3.靜態庫的特點?

1.測試目標檔案生成後,靜態庫刪掉,程式照樣可以執行。 

2.對庫的鏈結在編譯時期就已經完成,執行時和庫就沒有關係,因此靜態庫移植比較方便

3.所有的目標檔案與庫被鏈結成乙個可執行檔案,浪費空間

1.什麼是動態庫?

程式在執行的時候才去鏈結動態庫的**,多個程式共享使用庫的**。 在可執行檔案開始執行以前,外部函式的機器碼由作業系統從磁碟上的該動態庫中複製到記憶體中,這個 過程稱為動態鏈結。 

2.如何使用?

同樣是上面的例子生成動態庫:

●建立動態庫

1>fpic:產生位置無關碼

2>shared: 表示生成共享庫格式

●使用動態庫

跟靜態庫一樣使用,居然出錯了,怎麼肥事??這是由於系統根本找不到庫檔案。那麼要怎麼做:

1>拷貝.so檔案到系統共享庫路徑下, 一般指/usr/lib

2>更改 ld_library_path。

3>ldconfig  配置/etc/ld.so.conf.d/,ldconfig更新。

3.動態庫的特點?

1>將庫函式的鏈結載入推遲到程式執行時

2>動態庫可以在多個程式間共享,所以動態鏈結使得可執行檔案更小,節省了磁碟空間。作業系統採用虛 擬記憶體機制允許物理記憶體中的乙份動態庫被要用到該庫的所有程序共用,節省了記憶體和磁碟空間

3>程式更新相比靜態庫簡單。如果靜態庫更新了,那麼它的所有應用程式都要更新,但動態庫不用。

跟靜態庫一樣使用,居然出錯了,怎麼肥事??

Linux下的靜態庫與動態庫

準備三個檔案 time.c time.h test.c。函式庫的標頭檔案 ifndef time h define time h includevoid time endif time h 函式庫的源程式,包含時間列印函式 include time.h void time 測試函式,呼叫了時間列印函...

Linux下的靜態庫與動態庫

1 生成.so g test.cpp fpic shared o libtest.so 2 使用.so g l.ltest main.cpp 在使用.so的時候如果找不到.so需要把.so的路徑加到 etc ld.so.conf ldconfig使之生效 ldd 可以檢視main中是否包含了.so。...

Linux下的靜態庫與動態庫

在windows和linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的 你可以使用但要必須得遵守許可協議。在我們現實開發過程中,不可能每乙份 都從頭編寫,當...