如何诊断为什么找不到共享库?

时间:2020-07-10 17:07:51

标签: linux ld ldd

我正在尝试运行与combined -------- Apple Banana Blueberry 链接的应用程序

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搜索RPATHRUNPATH,但都未指定:

readelf

如果我明确设置了$ 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的情况下找不到libboost_system.so.1.63.0

1 个答案:

答案 0 :(得分:3)

您正在查看“错误”链接程序。 ld是静态链接器,不是运行时用来查找共享库的东西。

动态链接程序ld.so是查找共享库的地方。

动态链接程序确实会查看LD_LIBRARY_PATH,这就是如果您对其进行设置的原因。

如果您想更新动态链接器的搜索位置(并且不想设置LD_LIBRARY_PATH),则可以在/etc/ld.so.conf.d/中创建文件,并用{{1}更新/etc/ld.so.cache }。