error while loading shared libraries錯誤解決


在編譯引用了第三方庫的代碼后,執行出現了以下錯誤

[work@xxx zktest]$ ./a.out
./a.out: error while loading shared libraries: libzookeeper_st.so.2: cannot open shared object file: No such file or directory

這就是依賴的動態庫找不到路徑導致的

可以用ldd命令來看一下依賴的庫的路徑

[work@xxx zktest]$ ldd a.out
        linux-vdso.so.1 =>  (0x00007fff913d2000)
        libzookeeper_st.so.2 => not found
        librt.so.1 => /opt/compiler/gcc-4.8.2/lib/librt.so.1 (0x00007faebe222000)
        libstdc++.so.6 => /opt/compiler/gcc-4.8.2/lib/libstdc++.so.6 (0x00007faebdf1f000)
        libm.so.6 => /opt/compiler/gcc-4.8.2/lib/libm.so.6 (0x00007faebdc1c000)
        libgcc_s.so.1 => /opt/compiler/gcc-4.8.2/lib/libgcc_s.so.1 (0x00007faebda05000)
        libc.so.6 => /opt/compiler/gcc-4.8.2/lib/libc.so.6 (0x00007faebd658000)
        libpthread.so.0 => /opt/compiler/gcc-4.8.2/lib/libpthread.so.0 (0x00007faebd43a000)
        /opt/compiler/gcc-4.8.2/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x0000003dc4e00000)

可以看到上面的libzookeeper_st.so.2 => not found

解決方法有3種:

1、如果共享庫文件安裝到了/lib或/usr/lib目錄下, 那么需執行一下ldconfig命令

ldconfig命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件,緩存文件默認為/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表。

2、如果共享庫文件安裝到了/usr/local/lib(很多開源的共享庫都會安裝到該目錄下)或其它"非/lib或/usr/lib"目錄下,那么在執行ldconfig命令前,還要把新共享庫目錄加入到共享庫配置文件/etc/ld.so.conf中,如下:

# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig

3、如果共享庫文件安裝到了其它"非/lib或/usr/lib" 目錄下,但是又不想在/etc/ld.so.conf中加路徑(或者是沒有權限加路徑)。那可以export一個全局變量LD_LIBRARY_PATH,然后運行程序的時候就會去這個目錄中找共享庫

LD_LIBRARY_PATH的意思是告訴loader在哪些目錄中可以找到共享庫。可以設置多個搜索目錄,這些目錄之間用冒號分隔開。比如安裝了一個mysql到/usr/local/mysql目錄下,其中有一大堆庫文件在/usr/local/mysql/lib下面,則可以在.bashrc或.bash_profile或shell里加入以下語句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH  

 

采用第3種方法解決一下:

[work@xxx zktest]$ export LD_LIBRARY_PATH=/home/work/ABCDEFG/lib/:$LD_LIBRARY_PATH

再用ldd命令來看一下依賴的庫的路徑

[work@xxx zktest]$ ldd a.out   
        linux-vdso.so.1 =>  (0x00007fff4cbf5000)
        libzookeeper_st.so.2 => /home/work/ABCDEFG/lib/libzookeeper_st.so.2 (0x00007f0e90586000)
        librt.so.1 => /opt/compiler/gcc-4.8.2/lib/librt.so.1 (0x00007f0e9037e000)
        libstdc++.so.6 => /opt/compiler/gcc-4.8.2/lib/libstdc++.so.6 (0x00007f0e9007b000)
        libm.so.6 => /opt/compiler/gcc-4.8.2/lib/libm.so.6 (0x00007f0e8fd78000)
        libgcc_s.so.1 => /opt/compiler/gcc-4.8.2/lib/libgcc_s.so.1 (0x00007f0e8fb61000)
        libc.so.6 => /opt/compiler/gcc-4.8.2/lib/libc.so.6 (0x00007f0e8f7b4000)
        libpthread.so.0 => /opt/compiler/gcc-4.8.2/lib/libpthread.so.0 (0x00007f0e8f596000)
        /opt/compiler/gcc-4.8.2/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x0000003dc4e00000)

 

本文參考自:

http://blog.csdn.net/sahusoft/article/details/7388617

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM