靜態庫和動態庫 Linux系統程式設計之路

2021-04-15 12:27:06 字數 1967 閱讀 6544

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,裡面儲存了常用的動態函式庫,且會先把他們載入到記憶體中,因為記憶體的訪問速度遠遠大於硬碟的訪問速度,這樣可以提高軟體載入動態函式庫的速度了。 

linux 靜態庫和動態庫

1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...

Linux 靜態庫和動態庫

庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...

Linux 靜態庫和動態庫

我們指定c程式從 到乙個可執行程式需要經過預處理 編譯 彙編 鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的 體積較小,多個程式共同使用庫的 我們li...