動態庫與靜態庫的原理介紹

2021-07-05 05:52:00 字數 1516 閱讀 9675

在unix 的應用開發中,靜態庫和動態庫都是我們經常用到的技術,有必要對這兩個概念及

其原理做一些介紹。

靜態庫靜態庫是一些目標檔案的集合,通常為字尾為.o 的檔案,通過ar 工具打包而成,命名

格式為lib***.a

,其中*** 為給定的靜態庫檔名,如libm.a ,為數學函式庫,使用者也可以命名自己的庫。

在建立可執行程式的過程中,靜態庫同時被鏈結到程式**,被主程式呼叫的函式目標檔案連

同主程式組合成單一的可執行程式。靜態庫只在程式鏈結時起作用,最終的執行程式脫離靜態

庫執行。

動態庫按照其英文(shared library )也可理解為共享庫,動態庫的字尾一般為.so

,通過編譯器生成,

在不同的平台有不同的生成方法,但是在unix 平台中,其使用及工作原理是一致的。使用動態

庫建立執行程式,分為兩個階段:

鏈結階段,即通過ld 建立執行程式時,鏈結編輯器會在指定的動態庫中搜尋、解析被

主程式呼叫的函式及其他變數等,如引用被找到,則在執行程式的xcoff 頭結構的loader 區域,

建立包含引用的動態庫的影像,反之,如在指定的動態庫中沒有找到此引用的定義,編譯器會

給出類似未定義的符號引用錯誤。這不同於靜態庫,包含引用的目標檔案並不和執行程式鏈結

在一起。

另一階段為執行階段,即執行程式執行時。程式執行時,系統相關模組將讀取定義執行程

序的xcoff 頭結構中的資訊,查詢並載入相關的動態庫,假設,所有被應用的動態庫都被定位

且載入後,程式將開始執行。反之,如果,被應用的動態庫丟失,則程式報錯。這乙個過程我

們常稱之為動態鏈結。

可以通過乙個簡單的例子來分析靜態庫與動態庫的不同,假定執行程式名為a.out ,分別通過

靜態庫和動態庫編譯、鏈結,如下圖所示:

上圖,明顯的顯示出對同一主程式**,使用靜態庫和動態庫,建立的執行程式的不同,尤其

是程式大小。對使用動態庫的程式,程式啟動後,相關的動態庫的目標**載入到系統記憶體,而

且可以被其他使用此動態庫的執行程式共享使用。這樣,在給定的時間,統一動態庫的**在系

統中只有乙份拷貝,所有使用此動態庫的程式可共享這一拷貝。

動態鏈結的使用可以節省系統

記憶體的使用,對一些比較複雜的應用作用比較明顯,另外,執行程式**的減小,也可以節省磁

盤空間。

另外,我們還應當注意,

aix不同於其他

unix

的一點是動態庫(

shared library

)和動態物件

(shared object

),這兩個概念不能完全互換,動態物件只是單個的目標檔案,但在其

xcoff

頭結構中有一特殊標示位

sre(

shared reusable

),字尾為

.o。動態庫則是目標檔案的集合,包含動

態物件、普通目標檔案,其字尾為

.so。

ibm工程師

尋求技術支援。

**:

動態庫與靜態庫的原理介紹

在unix 的應用開發中,靜態庫和動態庫都是我們經常用到的技術,有必要對這兩個概念及其原理做一些介紹。靜態庫靜態庫是一些目標檔案的集合,通常為字尾為.o 的檔案,通過ar 工具打包而成,命名格式為lib a 其中 為給定的靜態庫檔名,如libm.a 為數學函式庫,使用者也可以命名自己的庫。在建立可執...

靜態庫與動態庫

linux下靜態庫 a 的例子 mylib.h 位於include資料夾下 ifndef mylib h define mylib h int add int a,int b endif mylib.cpp 位於lib資料夾中 include mylib.h int add int a,int b ...

靜態庫與動態庫

庫本質上是一種可執行的二進位制 可以被作業系統載入 linux和windows的庫是不相容的 庫可以分為靜態塊和動態庫,二者的不同點在於 被載入的時刻不同。靜態庫 在程式編譯時會被連線到目標 中,程式執行時不再需要改靜態庫,體積較大,一般應用與移植過程中在宿主機上編譯的 靜態庫檔名的命名規範是以li...