cannot open shared object file操作系统: No such file or directory解决

cannot open shared object file: No such file or directory解决

㈠ 历史背景

㈠ 历史背景

 

现如今、软件大多自带共享库、或者出于安全、或者基于商业考量

现如今、软件大多自带共享库、或者出于安全、或者基于商业考量

./move_db: error while loading shared libraries: libmysqlclient.so.15:
cannot 

如:

如:

open shared object file: No such file or directory 

Oracle :$ORACLE_HOME/lib

Oracle
:$ORACLE_HOME/lib

 

MySQL :$HOME/mysql/lib

MySQL :$HOME/mysql/lib

第一步:确认有哪些Lib无法Load 

下面贴上oracle用户下.bash_profile里关于LD_LIBRARY_PATH设置

下面贴上oracle用户下.bash_profile里关于LD_LIBRARY_PATH设置

>ldd move_db 

export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/X11R6/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/jdk/jre/lib/i386
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/jdk/jre/lib/i386/server
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/rdbms/lib 

export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/X11R6/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/jdk/jre/lib/i386
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/jdk/jre/lib/i386/server
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/rdbms/lib 

linux-gate.so.1 => (0x0089c000) 

 ㈡ 几个概念

 ㈡ 几个概念

libmysqlclient.so.15 => not found 

① 下面几个大意相近

① 下面几个大意相近

libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00cfa000) 

共享库、动态链接库、.so文件

共享库、动态链接库、.so文件

libm.so.6 => /lib/libm.so.6 (0x00804000) 

② ld.so 花名又叫:共享库加载器

② ld.so 花名又叫:共享库加载器

libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x009f8000) 

㈢ 存在的意义

㈢ 存在的意义

libc.so.6 => /lib/libc.so.6 (0x0069e000) 

用来告诉 ld.so 到哪里可以找到某某人的共享库

用来告诉 ld.so 到哪里可以找到某某人的共享库

/lib/ld-linux.so.2 (0x0067b000) 

㈣ 大概说说

㈣ 大概说说

 

.so文件的管理和加载由ld.so负责、他在标准路径/lib 或 /usr/lib
里查找APP所需的.so、

.so文件的管理和加载由ld.so负责、他在标准路径/lib 或 /usr/lib
里查找APP所需的.so、

第二步:系统要确认动态库的地址,把动态库的路径放到/etc/ld.so.conf中 

但对于非标路径:

但对于非标路径:

建议:在/etc/ld.so.conf.d/上新建动态库相应的文件配置文件*.conf, 

Linux做法是把私有路径加入/etc/ld.so.conf、运行ldconfig生成ld.so.cache、ld.so会去查找这个cache

Linux做法是把私有路径加入/etc/ld.so.conf、运行ldconfig生成ld.so.cache、ld.so会去查找这个cache

在该文件中填上该动态库的绝对路径 

UNIX作风则是采用LD_LIBRARY_PATH来处理非标路径的.so文件

UNIX作风则是采用LD_LIBRARY_PATH来处理非标路径的.so文件

此例: 

查找优先级如下(Linux):

查找优先级如下(Linux):

vim /etc/ld.so.conf.d/ld.mysql.so.conf 

① LD_LIBRARY_PATH 环境变量指定目录

① LD_LIBRARY_PATH 环境变量指定目录

/usr/local/mysql/lib 

② /etc/ld.so.conf指定目录

② /etc/ld.so.conf指定目录

 

③ 标准路径 先/usr/lib 再 /lib

③ 标准路径 先/usr/lib 再 /lib

第三步:运行ldconfig重建/etc/ld.so.cache

㈤ 常见错误

㈤ 常见错误

 

error while loading shared libraries:ooxx.so.0:cannot open shared object
file:No such file or directory

error while loading shared libraries:ooxx.so.0:cannot open shared object
file:No such file or directory

open shared object file: No such file or
directory解决 ./move_db: error while loading shared libraries:
libmysqlclient.so.15: cannot open shared object file: No such
file…

这里的ooxx是如何命名的、有兴趣的朋友自行参考 点击打开链接

这里的ooxx是如何命名的、有兴趣的朋友自行参考 点击打开链接

㈥ 通用的方案

㈥ 通用的方案

① 将这些自带库cp到/usr/lib或/lib、然后ldconfig  有个案例:点击打开链接

① 将这些自带库cp到/usr/lib或/lib、然后ldconfig  有个案例:点击打开链接

② /etc/ld.so.conf 、然后ldconfig

② /etc/ld.so.conf 、然后ldconfig

③ LD_LIBRARY_PATH(这个变量有些遭人诟病)

③ LD_LIBRARY_PATH(这个变量有些遭人诟病)

补充:

补充:

查看某程序所依赖的共享库的方法如下:

查看某程序所依赖的共享库的方法如下:

[[email protected]
~]# ldd /home/mysql/mysql/bin/mysqldump
        libpthread.so.0 => /lib64/libpthread.so.0
(0x000000337d200000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x000000337e600000)
        librt.so.1 => /lib64/librt.so.1 (0x000000337d600000)
        libdl.so.2 => /lib64/libdl.so.2 (0x000000337c600000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6
(0x00000031ebe00000)
        libm.so.6 => /lib64/libm.so.6 (0x000000337da00000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1
(0x00000031e9e00000)
        libc.so.6 => /lib64/libc.so.6 (0x000000337c200000)
        /lib64/ld-linux-x86-64.so.2 (0x000000337be00000)

[root@cdio ~]# ldd /home/mysql/mysql/bin/mysqldump
        libpthread.so.0 => /lib64/libpthread.so.0
(0x000000337d200000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x000000337e600000)
        librt.so.1 => /lib64/librt.so.1 (0x000000337d600000)
        libdl.so.2 => /lib64/libdl.so.2 (0x000000337c600000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6
(0x00000031ebe00000)
        libm.so.6 => /lib64/libm.so.6 (0x000000337da00000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1
(0x00000031e9e00000)
        libc.so.6 => /lib64/libc.so.6 (0x000000337c200000)
        /lib64/ld-linux-x86-64.so.2 (0x000000337be00000)

输出可分三列解释:

输出可分三列解释:

第一列:程序所依赖的库

第一列:程序所依赖的库

第二列:系统提供的与程序所需的库的对应库

第二列:系统提供的与程序所需的库的对应库

第三列:库加载的开始地址

第三列:库加载的开始地址

推荐阅读:

推荐阅读:

Linux命令之cd

Linux命令之cd
http://www.linuxidc.com/Linux/2013-05/83948.htm

Linux命令之cat

Linux命令之cat
http://www.linuxidc.com/Linux/2013-05/83947.htm

Linux命令之alias/unalias

Linux命令之alias/unalias
http://www.linuxidc.com/Linux/2013-05/83946.htm

Linux命令解析:su root和su -root

Linux命令解析:su root和su -root
http://www.linuxidc.com/Linux/2013-04/82564.htm

历史背景
现如今、软件大多自带共享库、或者出于安全、或者基于商业考量 如: Oracle
:$ORACLE_HOME/lib MySQL :$HOME/mysql/lib 下面贴上oracle用户…

操作系统 1