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

2021-06-18 03:39:54 字數 1075 閱讀 5937

在unix 的應用開發中,靜態庫和動態庫都是我們經常用到的技術,有必要對這兩個概念及其原理做一些介紹。

靜態庫靜態庫是一些目標檔案的集合,通常為字尾為.o 的檔案,通過ar 工具打包而成,命名格式為lib***.a ,其中*** 為給定的靜態庫檔名,如libm.a ,為數學函式庫,使用者也可以命名自己的庫。

在建立可執行程式的過程中,靜態庫同時被鏈結到程式**,被主程式呼叫的函式目標檔案連同主程式組合成單一的可執行程式。靜態庫只在程式鏈結時起作用,最終的執行程式脫離靜態庫執行。

動態庫按照其英文(shared library )也可理解為共享庫,動態庫的字尾一般為.so ,通過編譯器生成,在不同的平台有不同的生成方法,但是在unix 平台中,其使用及工作原理是一致的。使用動態庫建立執行程式,分為兩個階段:

鏈結階段,即通過ld 建立執行程式時,鏈結編輯器會在指定的動態庫中搜尋、解析被主程式呼叫的函式及其他變數等,如引用被找到,則在執行程式的xcoff 頭結構的loader 區域,建立包含引用的動態庫的影像,反之,如在指定的動態庫中沒有找到此引用的定義,編譯器會給出類似未定義的符號引用錯誤。這不同於靜態庫,包含引用的目標檔案並不和執行程式鏈結在一起。

另一階段為執行階段,即執行程式執行時。程式執行時,系統相關模組將讀取定義執行程式的xcoff 頭結構中的資訊,查詢並載入相關的動態庫,假設,所有被應用的動態庫都被定位且載入後,程式將開始執行。反之,如果,被應用的動態庫丟失,則程式報錯。這乙個過程我們常稱之為動態鏈結。

對使用動態庫的程式,程式啟動後,相關的動態庫的目標 **載入到系統記憶體,而且可以被其他使用此動態庫的執行程式共享使用。這樣,在給定的時間,統一動態庫的**在系統中只有乙份拷貝,所有使用此動態庫的程 序可共享這一拷貝。動態鏈結的使用可以節省系統記憶體的使用,對一些比較複雜的應用作用比較明顯,另外,執行程式**的減小,也可以節省磁碟空間。

另外,我們還應當注意,aix 不同於其他unix 的一點是動態庫(shared library )和動態物件(shared object ),這兩個概念不能完全互換,動態物件只是單個的目標檔案,但在其xcoff 頭結構中有一特殊標示位sre (shared reusable ),字尾為.o 。動態庫則是目標檔案的集合,包含動態物件、普通目標檔案,其字尾為.so 。

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

在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...