gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:52:02 25 4
gpt4 key购买 nike

我正在尝试运行链接到 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_PATH,为什么 ld 找不到 libboost_system.so.1.63.0

最佳答案

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

动态链接器,ld.so , 是用来定位共享库的。

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

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

关于linux - 如何诊断找不到共享库的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62839157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com