ldconfig及 LD_LIBRARY_PATH
ldconfig及 LD_LIBRARY_PATH
1. 往/lib和/usr/lib里面加?xùn)|西,是不用修改/etc/ld.so.conf的,但是完了之后要調(diào)一下ldconfig,不然這個(gè)library會(huì)找不到
2.想往上面兩個(gè)目錄以外加?xùn)|西的時(shí)候,一定要修改/etc/ld.so.conf,然后再調(diào)用ldconfig,不然也會(huì)找不到比如安裝了一個(gè)mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時(shí)就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存過后ldconfig一下,新的library才能在程序運(yùn)行時(shí)被找到。
3.如果想在這兩個(gè)目錄以外放lib,但是又不想在/etc/ld.so.conf中加?xùn)|西(或者是沒有權(quán)限加?xùn)|西)。那也可以,就是export一個(gè)全局變量LD_LIBRARY_PATH,然后運(yùn)行程序的時(shí)候就會(huì)去這個(gè)目錄中找library。一般來講這只是一種臨時(shí)的解決方案,在沒有權(quán)限或臨時(shí)需要的時(shí)候使用。
4. ldconfig做的這些東西都與運(yùn)行程序時(shí)有關(guān),跟編譯時(shí)一點(diǎn)關(guān)系都沒有。編譯的時(shí)候還是該加-L就得加,不要混淆了。
5. 總之,就是不管做了什么關(guān)于library的變動(dòng)后,最好都ldconfig一下,不然會(huì)出現(xiàn)一些意想不到的結(jié)果。不會(huì)花太多的時(shí)間,但是會(huì)省很多的事。
幾個(gè)特殊的環(huán)境變量: LD_DEBUG的用法:
[root@ljj c_c++]# LD_DEBUG=help ls Valid options for the LD_DEBUGenvironment variable are: libs display library search paths relocdisplay relocation processing files display progress for input filesymbols display symbol table processing bindings display informationabout symbol binding versions display version dependencies all allprevious options combined statistics display relocation statisticsunused determined unused DSOs help display this help message and exitTo direct the debugging output into a file instead of standard output afilename can be specified using the LD_DEBUG_OUTPUT environmentvariable.
[root@ljj c_c++]#
Linux支持共享庫已經(jīng)有悠久的歷史了,不再是什么新概念了。大家都知道如何編譯、連接以及動(dòng)態(tài)加載(dlopen/dlsym/dlclose)共享庫。但是,可能很多人,甚至包括一些高手,對(duì)共享庫相關(guān)的一些環(huán)境變量認(rèn)識(shí)模糊。當(dāng)然,不知道這些環(huán)境變量,也可以用共享庫,但是,若知道它們,可能就會(huì)用得更好。下面介紹一些常用的環(huán)境變量,希望對(duì)家有所幫助: LD_LIBRARY_PATH這個(gè)環(huán)境變量是大家最為熟悉的,它告訴loader:在哪些目錄中可以找到共享庫。可以設(shè)置多個(gè)搜索目錄,這些目錄之間用冒號(hào)分隔開。在linux下,還提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf中,或則在/etc/ld.so.conf.d里創(chuàng)建一個(gè)文件,把目錄加到這個(gè)文件里。當(dāng)然,這是系統(tǒng)范圍內(nèi)全局有效的,而環(huán)境變量只對(duì)當(dāng)前shell有效。按照慣例,除非你用上述方式指明,loader是不會(huì)在當(dāng)前目錄下去找共享庫的,正如shell不會(huì)在當(dāng)前目前找可執(zhí)行文件一樣。 LD_PRELOAD這個(gè)環(huán)境變量對(duì)于程序員來說,也是特別有用的。它告訴loader:在解析函數(shù)地址時(shí),優(yōu)先使用LD_PRELOAD里指定的共享庫中的函數(shù)。這為調(diào)試提供了方便,比如,對(duì)于C/C++程序來說,內(nèi)存錯(cuò)誤最難解決了。常見的做法就是重載malloc系列函數(shù),但那樣做要求重新編譯程序,比較麻煩。使用LD_PRELOAD機(jī)制,就不用重新編譯了,把包裝函數(shù)庫編譯成共享庫,并在LD_PRELOAD加入該共享庫的名稱,這些包裝函數(shù)就會(huì)自動(dòng)被調(diào)用了。在linux下,還提供了另外一種方式來完成同樣的功能,你可以把要優(yōu)先加載的共享庫的文件名寫在/etc/ld.so.preload里。當(dāng)然,這是系統(tǒng)范圍內(nèi)全局有效的,而環(huán)境變量只對(duì)當(dāng)前shell有效。 LD_ DEBUG這個(gè)環(huán)境變量比較好玩,有時(shí)使用它,可以幫助你查找出一些共享庫的疑難雜癥(比如同名函數(shù)引起的問題)。同時(shí),利用它,你也可以學(xué)到一些共享庫加載過程的知識(shí)。它的參數(shù)如下: libs display library search paths reloc display relocationprocessing files display progress for input file symbols display symboltable processing bindings display information about symbol bindingversions display version dependencies all all previous options combinedstatistics display relocation statistics unused determined unused DSOshelp display this help message and exit BIND_NOW這個(gè)環(huán)境變量與dlopen中的flag的意義是一致,只是dlopen中的flag適用于顯示加載的情況,而BIND_NOW/BIND_NOT適用于隱式加載。LD_PROFILE/LD_PROFILE_OUTPUT:為指定的共享庫產(chǎn)生profile數(shù)據(jù),LD_PROFILE指定共享庫的名稱,LD_PROFILE_OUTPUT指定輸出profile文件的位置,是一個(gè)目錄,且必須存在,默認(rèn)的目錄為/var/tmp/或/var/profile。通過profile數(shù)據(jù),你可以得到一些該共享庫中函數(shù)的使用統(tǒng)計(jì)信息。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/hahapro/archive/2008/04/01/2237654.aspx
總結(jié)
以上是生活随笔為你收集整理的ldconfig及 LD_LIBRARY_PATH的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晨开头的成语有哪些?
- 下一篇: 鬼谷八荒连心结有什么用?