Linux下靜態庫與動態庫的製作和使用

2021-08-20 00:18:27 字數 2355 閱讀 1321

1、linux作業系統支援的函式庫分為靜態庫和動態庫,動態庫又稱為共享庫。函式庫檔案主要存放在/lib /usr/lib

2、不管是靜態函式庫還是動態函式庫,都是由*.o目標檔案生成

這類庫檔案以lib***.a;利用靜態函式庫編譯成的檔案較大,因為整個庫的所有資料都會被整合到目標**中。

優點:編譯後的程式不需要外部的函式庫支援

缺點:如果靜態函式庫改變了,程式必須重新編譯,並且體積大

動態庫檔案的名字一般是lib***.so,動態庫又稱為共享庫,相對於靜態庫,動態函式庫在編譯時沒有被編譯到目標**中,程式執行到相關函式時才會該函式庫裡面相應的函式。

優點:多個應用程式使用同一函式庫,減少應用程式的體積

缺點:由於函式庫沒有整合到程式,所以程式的執行環境中必須提供相應的庫

例如:  add.h add.c sub.h sub.c main.c

#ifndef add_h 

#define add_h

int add(int

x,int

y);

#endif

#include

#include "add.h"

int add(int

x,inty)

#ifndef sub_h

#define sub_h

int sub(int x,int y);

#endif

// sub.c

#include #include "sub.h"

int sub(int x,int y)

#include

#include "sub.h"

#include "add.h"

int main()

不管是靜態函式庫還是動態函式庫,都是由 *.o目標檔案生成。

首先: gcc -c add.c

gcc -c sub.c

生成:add.o sub.o

1、靜態函式庫由ar命令建立

//建立靜態庫 libaddsub.a

ar -cr libaddsub.a

add.o

sub.o

-c create

-r replace,當插入的模板名已經在庫中粗在,則替換;不存在則出錯。預設情況下,新增的成員在庫的結尾處。

2、使用方法

//將靜態庫整合到main中

gcc -o main main.c -l

.-laddsub

-l 指定靜態函式庫的位置 供查詢,「.」表示靜態函式庫在本目錄下查詢

-l 指定了靜態函式庫名,由於靜態函式庫命名方式是lib***.a,其中的lib和.a忽略

特點:由於靜態庫的內容已經整合到了目標**中,因此,此處 刪除 libaddsub.a檔案,main 依然可以執行

//動態函式庫的建立

gcc -shared -fpic -o libaddsub.so

add.c

sub.c

-fpic 產生位置無關的**

-shared 生成共享庫

2、使用

//使用

gcc -o out main.c -l

.-laddsub

此時還不能立即./out,因為在動態函式庫使用時,會查詢/usr/lib /lib目錄下的動態函式庫,而此時我們生成的庫不在裡邊。

方法:

1、將libaddsub.so 貼上到 /usr/lib /lib

2、設定環境變數

假設libaddsub.so在/home/linux/addsub

export ld_library_path=/home/linux/addsub:$ld_library_path

1、靜態庫檔案的建立和使用,建立ok之後,直接將庫整合到目標檔案中

2、動態庫檔案的建立和使用,包括鏈結和載入兩個部分,建立和靜態庫差不多,載入時可以通過上面兩種方法

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