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