轉自:https://blog.csdn.net/jaylong35/article/details/6132087
1. 靜態庫和動態庫的基本概念
靜態庫,是在可執行程序鏈接時就已經加入到執行碼中,在物理上成爲執行程序的一部分;使用靜態庫編譯的程序運行時無需該庫文件支持,哪裏均可以用,可是生成的可執行文件較大。動態庫,是在可執行程序啓動時加載到執行程序中,能夠被多個可執行程序共享使用。使用動態庫編譯生成的程序相對較小,但運行時須要庫文件支持,若是機器裏沒有這些庫文件就不能運行。
2. 如何使用動態庫
如何程序在鏈接時使用了共享庫,就必須在運行的時候可以找到共享庫的位置。linux的可執行程序在執行的時候默認是先搜索/lib和/usr/lib這兩個目錄,而後按照/etc/ld.so.conf裏面的配置搜索絕對路徑。同時,Linux也提供了環境變量LD_LIBRARY_PATH供用戶選擇使用,用戶能夠經過設定它來查找除默認路徑以外的其餘路徑,如查找/work/lib路徑,你能夠在/etc/rc.d/rc.local或其餘系統啓動後便可執行到的腳本添加以下語句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。而且LD_LIBRARY_PATH路徑優先於系統默認路徑以前查找(詳細參考《使用 LD_LIBRARY_PATH》)。
不過LD_LIBRARY_PATH的設定做用是全局的,過多的使用可能會影響到其餘應用程序的運行,因此多用在調試。(LD_LIBRARY_PATH 的缺陷和使用準則,能夠參考《Why LD_LIBRARY_PATH is bad》)。一般狀況下推薦仍是使用gcc的-R或-rpath選項來在編譯時就指定庫的查找路徑,而且該庫的路徑信息保存在可執行文件中,運行時它會直接到該路徑查找庫,避免了使用LD_LIBRARY_PATH環境變量查找。
3.庫的連接時路徑和運行時路徑
現代鏈接器在處理動態庫時將連接時路徑(Link-time path)和運行時路徑(Run-time path)分開,用戶能夠經過-L指定鏈接時庫的路徑,經過-R(或-rpath)指定程序運行時庫的路徑,大大提升了庫應用的靈活性。好比咱們作嵌入式移植時#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉編譯好的zlib庫),將target編譯好後咱們只要把zlib庫拷貝到開發板的系統默認路徑下便可。或者經過- rpath(或-R )、LD_LIBRARY_PATH指定查找路徑。linux