Linux下動態鏈接庫




  • 什麼動態鏈接庫?

動態鏈接庫又稱爲共享庫,在linux下以lib***.so的形式存在,所謂動態,就是在程序運行是轉載鏈接,不像靜態在編譯是就已經知道需要的對象庫同時還將其鏈接複製到了程序體內!

  • 如何創建共享庫?

運用gcc(如果是C++程序就用bcc或g++)命令外加-shared(顧名思義,就是共享的意思)

例如:gcc -o lib***.so xxx.o yyy.o -shared 將生成lib***.so共享文件;

  • 不過大多數時候還加上一個命令參數-fpic,表示於位置無關,那麼什麼又叫做於位置無關呢?

與位置無關就是說,一個共享庫可能會在一個時刻或者一段時間被多個進程共享,而最先運行的程序將首次轉載此共享庫到內存中,其他進程將共享同一個庫副本;由於庫是第一個程序裝載的,它用共享庫當然沒問題,因爲是我請你來內存的;如果不叫於位置無關的參數命令,那麼其他的程序就用不了它,只好自己去請一個同樣的到內存來,大家想想,這樣是不是很浪費內存阿,每個進程進來都要自己帶一個進來佔用空間,大家何不和氣一點,用一個呢?因此就有了-fpic,實現多個進程共享同一個副本!也就是於位置無關了!

  • 相關命令:

ldd (參數)

參數是可執行程序,此命令可以查看程序所要用的所有共享庫文件!比如:ldd ./test

  • 還有一個很重要的問題:動態鏈接庫的加載?

如何加載一個自己的動態鏈接庫,我們知道系統的庫目錄一般都在lib目錄下面;簡單一點的方法就是將自己生存的共享庫直接丟到這些個目錄下面,因爲每個程序都會到系統指定的目錄下面去找;但是目錄裏面包含的東西太多了,不便於管理;還好系統爲我們提供一個環境變量(LD_LIBRARY_PATH)此變量在linux,unix, Solaris, FreeBSD等系統存在,而AIX系統中有一個LIBPATH變量,HPUX系統中有一個SHLIB_PATH變量;

有了以上的信息,我們便可以創建我們自己的共享庫目錄搜索路徑:

首先到用戶根目錄下,打開.bashrc(ubuntu下的,其他爲.bash_profile),然後就可添加環境變量:

export  LD_LIBRARY_PATH=此處填寫你的路徑名,如果有多個可以用冒號(:)隔開(比如:路徑1:路徑2:路徑3);OK,保存退出,重新打開終端後,便可成功!




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