在編譯引用了第三方庫的代碼后,執行出現了以下錯誤
[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