讓你輕松管理Linux共享庫
當我們在學習Linux時,我們經(jīng)常會遇到一些問題。比如說Linux運行的時候,是如何管理Linux共享庫的?在Linux下面,共享庫的尋找和加載是由/lib/ld.so實現(xiàn)的。ld.so在標準路經(jīng)(/lib,/usr/lib)中尋找應用程序用到的共享庫。
但是,如果需要用到的共享庫在非標準路經(jīng),ld.so怎么找到它呢?
目前,Linux通用的做法是將非標準路經(jīng)加入/etc/ld.so.conf,然后運行l(wèi)dconfig生成/etc/ld.so.cache。ld.so加載共享庫的時候,會從ld.so.cache查找。
傳統(tǒng)上,Linux的先輩Unix還有一個環(huán)境變量:LD_LIBRARY_PATH來處理非標準路經(jīng)的共享庫。ld.so加載共享庫的時候,也會查找這個變量所設置的路經(jīng)。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
exportLD_LIBRARY_PATH
但是,有不少聲音主張要避免使用LD_LIBRARY_PATH變量,尤其是作為全局變量。這些聲音是:
*LD_LIBRARY_PATHisnottheanswer-
http://prefetch.net/articles/linkers.badldlibrary.html
*WhyLD_LIBRARY_PATHisbad-
http://xahlee.org/UnixResource_dir/_/ldpath.html
*LD_LIBRARY_PATH-justsayno-
http://blogs.sun.com/rie/date/20040710
解決這一問題的另一方法是在編譯的時候通過-R選項指定run-timepath。
1.往/lib和/usr/lib里面加東西,是不用修改/etc/ld.so.conf的,但是完了之后要調(diào)一下ldconfig,不然這個library會找不到
2.想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然后再調(diào)用ldconfig,不然也會找不到
比如安裝了一個mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存過后ldconfig一下,新的library才能在程序運行時被找到。
3.如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有權限加東西)。那也可以,就是export一個全局變量LD_LIBRARY_PATH,然后運行程序的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有權限或臨時需要的時候使用。
4.ldconfig做的這些東西都與運行程序時有關,跟編譯時一點關系都沒有。編譯的時候還是該加-L就得加,不要混淆了。
5.總之,就是不管做了什么關于library的變動后,最好都ldconfig一下,不然會出現(xiàn)一些意想不到的結(jié)果。不會花太多的時間,但是會省很多的事。
LD_LIBRARY_PATH這個環(huán)境變量是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫??梢栽O置多個搜索目錄,這些目錄之間用冒號分隔開。在linux下,還提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf中,然后調(diào)用ldconfig。當然,這是系統(tǒng)范圍內(nèi)全局有效的,而環(huán)境變量只對當前shell有效。按照慣例,除非你用上述方式指明,loader是不會在當前目錄下去找共享庫的,正如shell不會在當前目前找可執(zhí)行文件一樣。
通過本文的介紹你就能輕松管理Linux共享庫。
【編輯推薦】