簡談鏈接庫

 

 

鏈接庫包括動態鏈接庫和靜態鏈接庫,其中動態鏈接庫又稱爲共享庫。靜態鏈接庫文件以.a, .lib爲後綴;而動態鏈接庫以.so, .dll爲後綴。關於鏈接庫,簡單來說有以下幾個方面要涉及到:

1 鏈接庫的概念?

鏈接庫本質上都是目標文件的集合,在編譯鏈接過程中作爲輸入。

靜態鏈接庫,鏈接過程中從鏈接庫中找到程序中所使用到的函數或者變量的定義,將其“拷貝”到所編譯的程序中,被"拷貝"的這部分(注意是部分,而不一定是全部)代碼在物理上就成爲可執行程序的一部分;使用靜態庫編譯的程序可以離線獨立執行,但是生成的可執行文件較大。

動態鏈接庫,在編譯鏈接時需要提供顯示指定動態鏈接庫的路徑,編譯器會在其中查找當前編譯的程序文本中沒有的函數或者變量的定義,找到這些定義即可,並不像使用靜態庫那樣進行定義的“拷貝”,找不到相關定義則報鏈接錯;此外,動態鏈接庫在可執行程序啓動時還需動態加載,因此,鏈接動態庫的可執行程序不能單獨執行,必須提供動態鏈接庫的路徑。動態鏈接庫可被多個程序共享,因此也稱之爲共享庫。

值得注意的是,鏈接庫中如果有定義和當前編譯的程序文本的定義重複時,會被忽略,編譯器默認使用程序中的定義,但並不會報告重定義錯誤;這點與直接使用.o文件進行編譯是不一樣的。

 

 

2 爲什麼要使用鏈接庫?

a.實現代碼共享

b.提高程序執行效率

c.代碼模塊化

d.安全性上的考慮

 

3 動態鏈接和靜態鏈接的區別?

a.動態鏈接:真正意義上的代碼共享,多個模塊可以使用同一個動態鏈接庫

   靜態鏈接:實際上是代碼拷貝,並不是真正的共享

b.動態鏈接:存儲壓力小

  靜態鏈接:做拷貝,佔用較多內存

c.動態鏈接:動態裝載較慢,運行時載入造成延遲。

  靜態鏈接:代碼在靜態裝載,沒有運行時延遲

d.動態鏈接:容易升級維護,在接口發生變化時,直接替換動態庫即可

  靜態鏈接:靜態庫需要重新編譯

e.動態鏈接:動態鏈接庫需要發佈,使得程序的可移植性較之使用靜態鏈接庫的程序要差

 

 

4 如何使用鏈接庫?

 

以gcc爲例:

可以直接在命令行指定生成動態鏈接庫,如:gcc -fPIC -shared -o libxxx.so *.c。fPIC指定生成位置無關代碼(因爲動態鏈接庫在動態加載),PIC亦即Position Independent Code(位置無關代碼)。

從目標文件生成靜態鏈接庫,如: ar crv -o libxxx.a *.o。

 

使用鏈接庫文件,最好在環境變量LD_LIBRARY_PATH中加入庫文件的路徑,或者也可以直接在命令行通過-L選項指定,如:

gcc -o exe -L ~/path -lxxx。 xxx即libxxx.a(so)

 

未完待續 ... ...

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章