動態庫專題 靜態庫和動態庫

2021-04-21 12:18:38 字數 1967 閱讀 3006

linux中有兩類函式庫,分別是靜態庫和動態庫。

靜態函式庫:

這類庫的名字一般是lib***.a;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標**中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函式庫改變了,那麼你的程式必須重新編譯。

動態函式庫:

這類庫的名字一般是lib***.so;相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目標**中,你的程式執行到相關函式時才呼叫該函式庫裡的相應函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態的申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的公升級比較方便。

linux系統有幾個重要的目錄存放相應的函式庫,如/lib /usr/lib。

下面來介紹linux靜態函式庫的建立和使用:

例程str_out.h str_out.c main.c:

str_out.h

#ifndef str_out_h

#define str_out_h

void str_out(const char* str);

#endif

str_out.c

#include

#include "str_out.h"

void str_out(const char* str)

main.c

int main()

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

所以先gcc -c str_out.c

靜態函式庫由ar命令建立

本例:ar -cr libstr_out.a str_out.o

-c create的意思

-r replace的意思,表示當插入的模組名已經在庫中存在,則替換同名的模組。如果若干模組中有乙個模組在庫中不存在,ar顯示乙個錯誤訊息,並不替換其他同名模組。預設的情況下,新的成員增加在庫的結尾處,可以使用其他任選項來改變增加的位置。

到此靜態函式庫建立完畢。

使用方法:通過gcc -o out main.c -l. -lstr_out編譯main.c就會把靜態函式庫整合進out。

其中 -l指定靜態函式庫的位置供查詢,注意l後面還有'.',表示靜態函式庫在本目錄下查詢。

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

根據靜態函式庫的特性,此處刪除libstr_out.a後out依然可以執行,因為靜態庫的內容已經整合進去了。

動態函式庫的建立和使用

gcc -shared -fpci -o out main.c -l. -lstr_out

用該命令生成libstr_out.so 動態函式庫。

gcc -o out main.c

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

這個時候有好幾種方法可以讓他成功執行:

最直接最簡單的方法就是把libstr_out.so拉到/usr/lib 或/lib中去。

還有一種方法 export ld_library_path=$(pwd)

另外還可以在/etc/ld.so.conf檔案裡加入我們生成的庫的目錄,然後/sbin/ldconfig。

/etc/ld.so.conf是非常重要的乙個目錄,裡面存放的是鏈結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib /lib中讀取的,所以想要順利執行,我們也可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig

另外還有個檔案需要了解/etc/ld.so.cache,裡面儲存了常用的動態函式庫,且會先把他們載入到記憶體中,因為記憶體的訪問速度遠遠大於硬碟的訪問速度,這樣可以提高軟體載入動態函式庫的速度了。

庫(靜態庫和動態庫)

一 靜態庫 以c語言的形式生成庫 h中extern c int add int int extern c int sub int int 二.測試靜態庫 將.h和.lib放入 h ifdef cplusplus c 程式設計師用c的方式開啟 extern c int add int int exte...

靜態庫和動態庫

一。靜態庫 靜態庫的優點在於使用簡單,編譯快速。靜態庫在應用程式生成時,已經編譯成為可重定位的目標檔案,因此可以不必再編譯,節省編譯時間,以最短的時間生成可執行程式。步奏 a。建立靜態庫 1 在編輯器中編輯其靜態庫函式 static lib.c 2 在shell中編譯該原始檔,生成乙個可重定位的目標...

靜態庫和動態庫

靜態庫 lib 中相當於存放了所有的源 包括他引入的其他靜態lib檔案.其實是所有cpp編譯後對應的.obj檔案的打包 所以靜態lib都比較大。動態庫dll也有lib但是這個lib,只是用來幫助程式在鏈結時定位dll中的函式的位址的。所以會在exe載入時才重定位函式的位址。重定位就是根據鏈結的這個l...