如何诊断找不到共享库的原因?

How do I diagnose why a shared library is not found?

我正在尝试 运行 链接到 libboost_system.so

的应用
$ ./app
app: error while loading shared libraries: libboost_system.so.1.63.0: cannot open shared object file: \
     No such file or directory

如果我 运行 ldd 在应用程序上,它显示找不到图书馆:

$ ldd ./app
    linux-vdso.so.1 (0x00007ffdedb94000)
    libboost_system.so.1.63.0 => not found
    libpcap.so.1 => /lib64/libpcap.so.1 (0x00007f19a1a7b000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f19a1a70000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f19a1a69000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f19a1879000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f19a1733000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f19a1716000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f19a16f4000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f19a152a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f19a1ae5000)

库在我的系统上:

$ locate libboost_system.so.1.63.0
/usr/local/lib/libboost_system.so.1.63.0

$ ls -la /usr/local/lib/libboost_system*
-rw-r--r--. 1 root root 47014 Jul  2 16:57 /usr/local/lib/libboost_system.a
lrwxrwxrwx. 1 root root    25 Jul  2 16:57 /usr/local/lib/libboost_system.so -> libboost_system.so.1.63.0
-rwxr-xr-x. 1 root root 19816 Jul  2 16:57 /usr/local/lib/libboost_system.so.1.63.0

ld配置为/usr/local/lib:

$ ld --verbose | grep SEARCH_DIR | sed 's/; /\n/g'
SEARCH_DIR("=/usr/x86_64-redhat-linux/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/x86_64-redhat-linux/lib")
SEARCH_DIR("=/usr/local/lib")                    <----- here
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib")

我也运行ldconfig刷新了缓存,但是没用。

我尝试用 readelf 搜索 RPATHRUNPATH,但均未指定:

$ readelf -d ./app | grep -i path
< no results >

如果我明确设置 LD_LIBARY_PATH 则库 发现:

$ LD_LIBRARY_PATH=/usr/local/lib ldd ./app
    linux-vdso.so.1 (0x00007fffa9a5d000)
    libboost_system.so.1.63.0 => /usr/local/lib/libboost_system.so.1.63.0 (0x00007f5fff664000)
    libpcap.so.1 => /lib64/libpcap.so.1 (0x00007f5fff5fc000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f5fff5f1000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f5fff5ea000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f5fff3fa000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f5fff2b4000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f5fff297000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5fff275000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f5fff0ab000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5fff66b000)

为什么不指定 LD_LIBRARY_PATHld 找不到 libboost_system.so.1.63.0

您正在查看“错误的”链接器。 ld 是静态链接器,而不是运行时用来定位共享库的链接器。

动态链接器 ld.so 用于定位共享库。

动态链接器确实会查看 LD_LIBRARY_PATH,这就是设置它后它会起作用的原因。

如果您想更新动态链接器的搜索位置(并且不想设置 LD_LIBRARY_PATH),您可以在 /etc/ld.so.conf.d/ 中创建一个文件并使用 [= 更新 /etc/ld.so.cache 15=].