談談Linux下動態庫查找路徑的問題

    學習到了一個階段以後,就須要不斷的總結、沉澱、清零,而後才能繼續「上路」。回想起本身當年剛接觸Linux時,不論是用源碼包編譯程序,仍是程序運行時出現的和動態庫的各類恩恩怨怨,內心那真叫一個難受。那時候腦殼裏曾經也犯過嘀咕,爲啥Linux不弄成windows那樣呢,裝個軟件那個麻煩不說,連運行軟件都這麼惱火呢?若是那樣的話就不叫Linux了。借用小米公司CEO雷軍一句話:小米,爲發燒而生。我認爲:Linux,爲真理而在。特別是爲那些喜歡折騰,熱衷技術背後原理和實現細節的人們而生。

   說到和動態庫查找路徑相關的問題,整體上能夠分爲兩類:
   
第一類:經過源代碼編譯程序時出現的找不到某個依賴包的問題,而若是此時你剛好已經按照它的要求確確實實、千真萬確、天地良心地把依賴庫給裝好了,它還給你耍混、犯二,有一股折騰不死人不償命的勁兒,那讓人真是氣兒不打一處來,若是Linux此時有頭有臉,你是否是特想抽它丫兩大嘴巴;
   
第二類:就是在運行程序的時候,明明把那個程序須要的依賴包都已經安裝的妥妥的了,可運行的時候人家就告訴你說「error while loading shared libraries: libxxx.so.y: cannot open shared object file: No such file or directory」,任憑你怎麼折騰都沒用。此時你要是心想「撤吧,哥們,Linux太TM欺負人了,不帶這麼玩兒的」,那你就大錯特錯了,只要你抱着「美好的事情的總會發生」和「辦法永遠比問題多」的信念堅持下去,你就必定會成功。話的意思有點自欺欺人,精神鴉片的味道在裏面,但確實是這麼個理兒。
   
   
上面兩類問題最大的緣由就是,你沒弄白它們的機制和原理。你看到的只是現象,當年學馬克思主義主義哲學原理的時候,老師怎麼教導咱們的?要透過現象看本質。若是你把上面兩中應用的原理搞清了,那問題不就天然而然的迎刃而解了麼。下面我們就一一探討一下這兩個問題,以便對新進學習Linux的朋友們起一個的參考資料的做用。

    問題1 :經過源代碼安裝程序
    經過源碼包安裝程序時,主要用到了「三大步」策略:configure、make和make install 。出問題最多的就是在configure階段,不少初學者因爲不知道configure的那麼多參數該怎麼用,因此每每爲了省事,一句簡單的「./configure」下去,百分之八九十都能成功,可問題每每就出在剩下的百分之十幾上面了。這讓咱們又一次相信了,小几率事件的發生對事情的影響是多麼的深遠。在安裝的configure階段,爲了檢測安裝安裝環境是否知足,一般狀況下都是經過一個叫作pkg-config的工具來檢測它須要依賴的動態庫是否存在,這個工具咱們在上一篇博文已經認識過了。pkg-config一般狀況都是位於/usr/bin目錄下,是個可執行程序。在configure階段,一般都會用pkg-config來判斷所依賴的動態庫是否存在。如今問題就是,這個工具是如何判斷的呢?它的依據是什麼?當這兩個問題弄明白了,真相也就大白了。

   通常當咱們安裝完某個程序後,若是它提供了動態庫的功能,在源碼中都會有一個或多個以pc結尾的文件,當執行完make install後這些pc文件拷貝到${prefix}/lib/pkgconfig這個目錄裏,這裏的prefix就是咱們在configure階段時經過配置參數--prefix指定的,缺省狀況這個值就是/usr/local,因此這些pc文件最終會被拷貝到/usr/local/lib/pkgconfig目錄下。可能有人會問,這些pc文件有啥用呢?咱們隨便打開一個來瞅瞅:

[root@localhost ~]# cat /usr/local/lib/pkgconfig/librtmp.pc
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
incdir=${prefix}/include


Name: librtmp
Description: RTMP implementation
Version: v2.3
Requires: libssl,libcrypto
URL: http://rtmpdump.mplayerhq.hu
Libs: -L${libdir} -lrtmp -lz
Cflags: -I${incdir}

   跟咱們configure階段相關的主要集中在Libs和Cflags兩項上面,若是你此時再執行下面這兩條命令,就全明白了:
[root@localhost ~]# pkg-config --cflags librtmp
-I/usr/local/include
[root@localhost ~]# pkg-config --libs librtmp
-L/usr/local/lib -lrtmp -lz -lssl -lcrypto

   也就是說,pkg-config把咱們之前須要在Makefile裏指定編譯和連接時所須要用到的參數從手工硬編碼的模式變成了自動完成,節約了多少跨平臺移植的兼容性問題,咱們是否是得感謝人家十八輩兒祖宗。假如說,若是咱們將要的編譯的軟件包依賴librtmp這個動態庫,那麼此時在我係統上這個檢測就算經過了。固然這只是第一步,檢測過了不必定兼容,這裏咱們只討論能不能找到依賴庫的問題,兼容性問題那都不是個事兒,人家要啥版本你好生伺候就是了,這個沒得商量,最好也不要商量,童叟無欺,否則後果很嚴重。好了,若是說找不到某個庫該怎麼辦。 前提是你確確實實已經安裝了它須要的庫, 不用多想,緣由只有一個,pkg-config找不到這個與這個庫對應的pc文件。爲何會找不到呢,緣由又有兩點:
   一、pkg-config搜索了全部它認爲合適的目錄都沒找着這個庫對應的pc文件的下落;
   二、這個庫在發佈時根本就沒有提供它的pc文件。
   這裏,咱們嚴重「抗議、鄙視+抵制」第二種狀況的軟件包,並且也儘可能不要它,一個出來混都不自報家門的傢伙,確定也好不到哪裏去。那麼,如今問題就只剩下一個了:pkg-config的查找路徑是哪裏?

   pkg-config較老的版本里,缺省狀況下會到/usr/lib/pkgconfig、/usr/loca/lib/pkgconfig、/usr/share/pkgconfig等目錄下去搜索pc文件,據我所知在0.23以及以後的版本里pkg-config的源碼裏已經沒有關於缺省搜索路徑的任何硬編碼的成分了,至於具體從哪一個版本開始我也沒有去追究,還望有知道的朋友分享一下。取而代之的是,當你看pkg-config的man手冊時會有下面一段話:

pkg-config retrieves information about packages from special metadata files. These files are  named  after the  package,  with  the extension .pc.
By default, pkg-config looks in the directory prefix/lib/pkgconfig for these files; it will also look in the colon-separated (on Windows, semicolon-separated) list of directories specified by the PKG_CONFIG_PATH environment variable.

   以及這點補充:
PKG_CONFIG_PATH
    A colon-separated (on Windows, semicolon-separated) list of directories to search  for  .pc  files. The  default directory will always be searched after searching the path; the default is libdir/pkg-config:datadir/pkgconfig where libdir is the libdir where pkg-config and  datadir  is  the  datadir where pkg-config was installed.


   上面提到的prefix、libdir和datadir,就是安裝pkg-config時被設定好的,具體狀況是:
   一、若是你是經過yum和rpm包安裝的
        prefix=/usr
       libdir=${prefix}/lib=/usr/lib
       datadir=${prefix}/share=/usr/share
   二、若是你是經過源碼包安裝的,且沒有指定prefix的值(指定的狀況同1)
       prefix=/usr/local
       libdir=${prefix}/lib=/usr/local/lib
       datadir=${prefix}/share=/usr/local/share
 


   pkg-config在查找對應軟件包的信息時的缺省搜索路徑已經很清楚了,有一點寫錯了,不是${ libdir}/pkg-config,而應該是${libdir}/pkgconfig和${ datadir}/pkgconfig 。若是你軟件包對應的pc文件都不在這兩個目錄下時,pkg-config確定找不到 。既然緣由都已經找到了,那解決辦法也就多種多樣了。
   方案一 咱們能夠在安裝咱們那個被依賴的軟件包時,在configure階段用--prefix參數把安裝目錄指定到/usr目錄下;
   方案二 也能夠按照上面說的,經過一個名叫PKG_CONFIG_PATH的環境變量來向pkg-config指明咱們本身的pc文件所在的路徑,不過要注意的是PKG_CONFIG_PATH所指定的路徑優先級比較高,pkg-config會先進行搜索,完了以後纔是去搜索 缺省路徑。
   前者的優勢是之後再經過源碼安裝軟件時少了很多麻煩,缺點是用戶本身的軟件包和系統軟件 混到一塊兒不方便管理,因此實際使用中,後者用的要多一些。

    方案二在實際操做中有兩種實現方式:
   一、針對沒有root權限的狀況,大多數狀況都是執行:
export PKG_CONFIG_PATH=/your/local/path:$PKG_CONFIG_PATH

   而後,在configure時就絕對沒問題了。
   二、在用戶的家目錄下的 .bash_profile文件裏 或系統文件 /etc/profile 的末尾添加上面一行也成,均可以。
   至此, 動態庫查找問題的 第一種狀況就完全解決了。想了解pc文件的更多細節的,能夠參考 http://people.freedesktop.org/~dbn/pkg-config-guide.html  ; 想學習pkg-config工具更多用法的朋友建議看man手冊。

    問題2:程序運行時出現libxxx.so.y => not found
   這種狀況,在我之前的博文「 Linux系統下動態庫和靜態庫那點事兒 」裏已經提到一部分,這裏就把它補充完整。在那篇博文裏,我用的配置文件或者「ldconfig 動態庫所在路徑 的方式解決的,也是99%的場合下的解決辦法,那是針對有root權限的用戶的解決辦法。沒有root權限運行軟件時,Linux也爲 咱們提供了一個名爲 LD_LIBRARY_PATH的環境變量來解決運行時動態庫查找路徑的解決方案。一樣地,由這個環境變量所指定的路徑會被裝載器 /lib/ld-2.12.so優先查找,而後纔是動態庫庫緩存文件 /etc/ld.so.cache ,風采瞬間 就被 LD_LIBRARY_PATH給搶完了, /etc/ld.so.cache表示很不高興。 針對 LD_LIBRARY_PATH 環境變量 這種狀況, 絕對是臨時不能再臨時解決方案了,若是隻是測試用,用export像解決PKG_CONFIG_PATH 同樣的方式乾淨利索就好了, 千萬不要在實際生產上線的運維環境裏把「export LD_LIBRARY_PATH=...」 添加到 .bash_profile或者 /etc/profile裏,否則到時候悔得你腸子都綠了不可

   其實 PKG_CONFIG_PATH LD_LIBRARY_PATH常常被不少人誤用,特別是新手們在解決問題時,也不分青紅皁白,逮着了就是一頓狂export,根據實際場合,運氣好了說不定問題還真就解決,點兒背了折騰一天半宿也是白忙活。其實要是留點心,仍是挺容易明白的:
   
PKG_CONFIG_PATH從字面意思上翻譯,就是「軟件包的配置路徑」,這不很明顯了麼,編譯軟件時若是出現找不到所依賴的動態庫時都全靠PKG_CONFIG_PATH了
   
LD_LIBRARY_PATH也很直白了「裝載器的庫路徑」,LD是Loader的簡寫,在博文「段錯誤究竟是何方妖孽」裏我也曾提到過,在Linux系統啓動一個程序的過程就叫作裝載, 一個程序要執行時它或多或少的會依賴一些動態庫(靜態編譯的除外 )。當你用「ldd 可執行程序名 」查看一個軟件啓動時 所依賴的動態庫,若是輸出項有「libxxx.so.y=> not found 」一項,你這個軟件100% 運行不起來。

   不信咱們來作個試驗:

[root@localhost ~]# echo $LD_LIBRARY_PATH    //嘛也沒有

[root@localhost ~]# ldd /usr/local/bin/ffmpeg
        linux-gate.so.1 =>  (0x00914000)
        libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x007d0000)
        libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x001f3000)
        libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x002b5000)
        libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0xb68dd000)
        libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x0083c000)
        libswresample.so.0 => /usr/local/lib/libswresample.so.0 (0x00a91000)
        libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x00d80000)
        libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x001a7000)
        libm.so.6 => /lib/libm.so.6 (0x0058b000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x001d7000)
        libc.so.6 => /lib/libc.so.6 (0x005e2000)
        libasound.so.2 => /lib/libasound.so.2 (0x00ec5000)
        libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x00116000)
        librt.so.1 => /lib/librt.so.1 (0x00184000)
        libfreetype.so => /usr/local/lib/libfreetype.so (0x00411000)
        libass.so.4 => /usr/local/lib/libass.so.4 (0x0091a000)
        libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x0048c000)
        libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00aa8000)
        librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x009dd000)
        libz.so.1 => /lib/libz.so.1 (0x0018d000)
        libx264.so.132 => /usr/local/lib/libx264.so.132 (0x00fb1000)
        libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x0194d000)
        libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x004e5000)
        libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x00799000)
        libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x0050d000)
        libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x0052d000)
        libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x00779000)
        libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00c94000)
        libmp3lame.so.0 => /usr/local/lib/libmp3lame.so.0 (0x0088c000)
        libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x00573000)
        /lib/ld-linux.so.2 (0x005c2000)
        libdl.so.2 => /lib/libdl.so.2 (0x001a1000)
        libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x005b5000)
        libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x007b5000)
        libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1 (0x007ea000)
        libogg.so.0 => /usr/local/lib/libogg.so.0 (0x00583000)
        libexpat.so.1 => /lib/libexpat.so.1 (0x00933000)

   個人系統裏沒有設置 LD_LIBRARY_PATH 環境變量,上一篇博文裏編譯的ffmpeg運行時依賴的很是多的動態庫。如今咱們把其中的一個庫libmp3lame.so.0從/usr/loca/lib下移動到/opt目錄裏,並執行ldconfig ,讓libmp3lame.so.0完全從/etc/ld.so.cache裏面消失。其實libmp3lame.so.0只是libmp3lame.so.0.0.0的一個符號連接,咱們真正須要移動的是後者,完了以後再執行ldd /usr/local/bin/ffmpeg時結果以下:

[root@localhost ~]# ldd /usr/local/bin/ffmpeg
        linux-gate.so.1 =>  (0x00249000)
        libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x00e12000)
        libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x00ccd000)
        libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x00891000)
        libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0xb6877000)
        libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x001a6000)
        libswresample.so.0 => /usr/local/lib/libswresample.so.0 (0x00b8f000)
        libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x0024a000)
        libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x005d7000)
        libm.so.6 => /lib/libm.so.6 (0x007ad000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x001f6000)
        libc.so.6 => /lib/libc.so.6 (0x0029f000)
        libasound.so.2 => /lib/libasound.so.2 (0x00604000)
        libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x00436000)
        librt.so.1 => /lib/librt.so.1 (0x00a06000)
        libfreetype.so => /usr/local/lib/libfreetype.so (0x0052d000)
        libass.so.4 => /usr/local/lib/libass.so.4 (0x00211000)
        libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x00eed000)
        libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00f46000)
        librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x004b9000)
        libz.so.1 => /lib/libz.so.1 (0x0022a000)
        libx264.so.132 => /usr/local/lib/libx264.so.132 (0x0765d000)
        libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x00a0f000)
        libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x004ce000)
        libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x005a8000)
        libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x006f0000)
        libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x00710000)
        libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x00756000)
        libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00770000)
        libmp3lame.so.0 => not found    //果真飄紅了 :)
        libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x004a4000)
        /lib/ld-linux.so.2 (0x0050d000)
        libdl.so.2 => /lib/libdl.so.2 (0x0023e000)
        libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x004f6000)
        libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x0078a000)
        libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1 (0x007d7000)
        libogg.so.0 => /usr/local/lib/libogg.so.0 (0x00243000)
        libexpat.so.1 => /lib/libexpat.so.1 (0x00806000)

[root@localhost ~]# ffmpeg --help
ffmpeg: error while loading shared libraries: libmp3lame.so.0: cannot open shared object file: No such file or directory  //此時ffmpeg固然運行不起來
   
   咱們來試試 LD_LIBRARY_PATH,看看好使不:
[root@localhost opt]# export LD_LIBRARY_PATH=/opt:$LD_LIBRARY_PATH
[root@localhost opt]#
[root@localhost opt]# ldd /usr/local/bin/ffmpeg
        linux-gate.so.1 =>  (0x00136000)
        libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x00552000)
        libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x00655000)
        libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x00243000)
        libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0xb68a7000)
        libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x00137000)
        libswresample.so.0 => /usr/local/lib/libswresample.so.0 (0x00187000)
        libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x0047e000)
        libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x00a9d000)
        libm.so.6 => /lib/libm.so.6 (0x00af9000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00823000)
        libc.so.6 => /lib/libc.so.6 (0x0083e000)
        libasound.so.2 => /lib/libasound.so.2 (0x0055f000)
        libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x0019e000)
        librt.so.1 => /lib/librt.so.1 (0x00b3c000)
        libfreetype.so => /usr/local/lib/libfreetype.so (0x0039f000)
        libass.so.4 => /usr/local/lib/libass.so.4 (0x00f67000)
        libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x00cb3000)
        libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00d0c000)
        librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x0020c000)
        libz.so.1 => /lib/libz.so.1 (0x00c77000)
        libx264.so.132 => /usr/local/lib/libx264.so.132 (0x00f80000)
        libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x07c66000)
        libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x0041a000)
        libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x0076c000)
        libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x004fe000)
        libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x00717000)
        libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x00f0c000)
        libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00221000)
        libmp3lame.so.0 => not found           //納尼??!!!
        libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x00124000)
        /lib/ld-linux.so.2 (0x00bad000)
        libdl.so.2 => /lib/libdl.so.2 (0x0023b000)
        libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x007b6000)
        libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x00442000)
        libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1 (0x0051e000)
        libogg.so.0 => /usr/local/lib/libogg.so.0 (0x009f7000)
        libexpat.so.1 => /lib/libexpat.so.1 (0x00b60000)

   還記得上面提到了軟連接麼,libmp3lame.so.0就是libmp3lame.so.0.0.0的軟連接,這是動態庫的命名規範的一種公約,咱們只要在/opt/目錄下創建一個名爲 libmp3lame.so.0的到/opt/libmp3lame.so.0.0.0的軟連接 就OK了:

[root@localhost opt]# ls
libmp3lame.so.0.0.0
[root@localhost opt]# ln -s libmp3lame.so.0.0.0 libmp3lame.so.0
[root@localhost opt]# ll
total 316
lrwxrwxrwx. 1 root root     19 Dec  7 23:27 libmp3lame.so.0 -> libmp3lame.so.0.0.0
-rwxr-xr-x. 1 root root 321228 Dec  7 23:25 libmp3lame.so.0.0.0
[root@localhost opt]# ldd /usr/local/bin/ffmpeg
        linux-gate.so.1 =>  (0x00cc4000)
        libavdevice.so.54 => /usr/local/lib/libavdevice.so.54 (0x00577000)
        libavfilter.so.3 => /usr/local/lib/libavfilter.so.3 (0x00e3f000)
        libavformat.so.54 => /usr/local/lib/libavformat.so.54 (0x00202000)
        libavcodec.so.54 => /usr/local/lib/libavcodec.so.54 (0x00f01000)
        libpostproc.so.52 => /usr/local/lib/libpostproc.so.52 (0x00170000)
        libswresample.so.0 => /usr/local/lib/libswresample.so.0 (0x00750000)
        libswscale.so.2 => /usr/local/lib/libswscale.so.2 (0x0035e000)
        libavutil.so.52 => /usr/local/lib/libavutil.so.52 (0x005ba000)
        libm.so.6 => /lib/libm.so.6 (0x00452000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x001c0000)
        libc.so.6 => /lib/libc.so.6 (0x008c2000)
        libasound.so.2 => /lib/libasound.so.2 (0x0047c000)
        libdc1394.so.22 => /usr/local/lib/libdc1394.so.22 (0x003d6000)
        librt.so.1 => /lib/librt.so.1 (0x00db3000)
        libfreetype.so => /usr/local/lib/libfreetype.so (0x00a80000)
        libass.so.4 => /usr/local/lib/libass.so.4 (0x001db000)
        libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x005e7000)
        libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x00afb000)
        librtmp.so.0 => /usr/local/lib/librtmp.so.0 (0x00584000)
        libz.so.1 => /lib/libz.so.1 (0x00599000)
        libx264.so.132 => /usr/local/lib/libx264.so.132 (0x02bc9000)
        libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x05ccd000)
        libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x00640000)
        libvo-aacenc.so.0 => /usr/local/lib/libvo-aacenc.so.0 (0x00834000)
        libtwolame.so.0 => /usr/local/lib/libtwolame.so.0 (0x00668000)
        libtheoraenc.so.1 => /usr/local/lib/libtheoraenc.so.1 (0x00688000)
        libtheoradec.so.1 => /usr/local/lib/libtheoradec.so.1 (0x006ce000)
        libspeex.so.1 => /usr/local/lib/libspeex.so.1 (0x00815000)
        libmp3lame.so.0 => /opt/libmp3lame.so.0 (0x00767000)   //終於圓滿了:)
        libfaac.so.0 => /usr/local/lib/libfaac.so.0 (0x006e8000)
        /lib/ld-linux.so.2 (0x003b6000)
        libdl.so.2 => /lib/libdl.so.2 (0x001f4000)
        libraw1394.so.11 => /usr/local/lib/libraw1394.so.11 (0x00444000)
        libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x006f8000)
        libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1 (0x00710000)
        libogg.so.0 => /usr/local/lib/libogg.so.0 (0x001f9000)
        libexpat.so.1 => /lib/libexpat.so.1 (0x007e3000)


   因此說,針對動態庫路徑查找的種種問題 ,無非就這麼兩大類,關鍵是找對緣由,對症下藥,方能藥到病除。
相關文章
相關標籤/搜索