利用ldd命令,判断某条命令需要哪些共享库文件的支持
ldd /usr/local/nginx/sbin/nginx
输出如下:
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003dd2800000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003dd4c00000)
libfastcommon.so => /usr/local/lib/libfastcommon.so (0x00002b8beed1b000)
libfdfsclient.so => /usr/local/lib/libfdfsclient.so (0x00002b8beef35000)
libpcre.so.0 => /lib64/libpcre.so.0 (0x0000003dd3400000)
libssl.so.6 => /lib64/libssl.so.6 (0x0000003dd6800000)
libcrypto.so.6 => /lib64/libcrypto.so.6 (0x0000003dd6000000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003dd2400000)
libz.so.1 => /usr/lib64/libz.so.1 (0x0000003dd3000000)
libprofiler.so.0 => /usr/local/lib/libprofiler.so.0 (0x00002b8bef14d000)
libc.so.6 => /lib64/libc.so.6 (0x0000003dd2000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003dd1c00000)
libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x0000003dd6400000)
libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x0000003dda400000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003dd8400000)
libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x0000003dd9c00000)
libunwind.so.8 => /usr/local/lib/libunwind.so.8 (0x00002b8bef361000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003dd5400000)
libm.so.6 => /lib64/libm.so.6 (0x0000003dd2c00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003dd4400000)
libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x0000003dd9800000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003dd8000000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003dd8800000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003dd3c00000)
libsepol.so.1 => /lib64/libsepol.so.1 (0x0000003dd3800000)
ldd 命令打印的结果中,“=>”左边的表示该程序需要连接的共享库之 so 名称,右边表示由 Linux 的共享库系统找到的对应的共享库在文件系统中的具体位置
默认情况下,/etc/ld.so.conf
文件中包含有默认的共享库搜索路径
ldd 命令时没有找到对应的共享库文件和其具体位置,可能是两种情况引起的
- 共享库没有安装在该系统中
- 共享库保存在
/etc/ld.so.conf
文件列出的搜索路径之外的位置
通常情况下,许多开放源代码的程序或函数库都会默认将自己安装到 /usr/local 目录下的相应位置(如:/usr/local/bin 或 /usr/local/lib),以便与系统自身的程序或函数库相区别。而许多 Linux 系统的 /etc/ld.so.conf 文件中默认又不包含 /usr/local/lib。因此,往往会出现已经安装了共享库,但是却无法找到共享库的情况。
具体解决办法如下: 检查 /etc/ld.so.conf 文件,如果其中缺少 /usr/local/lib 目录,就添加进去
内容示例:
include ld.so.conf.d/*.conf/usr/local/BerkeleyDB.4.3/lib/usr/lib/usr/local/mysql/lib
注意:在修改了 /etc/ld.so.conf 文件或者在系统中安装了新的函数库之后,需要运行一个命令:ldconfig ,该命令用来刷新系统的共享库缓存,即 /etc/ld.so.cache 文件。
为了减少共享库系统的库搜索时间,共享库系统维护了一个共享库 so 名称的缓存文件/etc/ld.so.cache。因此,在安装新的共享库之后,一定要运行 ldconfig 刷新该缓存。
- 编译文件出现undefined reference to "XXX",也表示找不到依赖库 如果已经安装各依赖库并且已经配置了/etc/ld.so.conf,则需要直接在Makefile文件中添加 -L/usr/local/lib等引入依赖库文件所在位置再重新编译程序