当我运行一个在运行时链接到共享库的进程(在进程启动时链接,而不是稍后用链接),除了之外dlload()
它还在哪里寻找该共享库( )文件?.so
LD_LIBRARY_PATH
背景:
我编写了一些使用特定第三方库的 C++ 代码。我已在两个不同的平台上安装了该库并编译了我的代码,这两个平台都是 Ubuntu,但版本不同,并且 gcc 的版本也不同。该库是从源代码编译和安装的,位于/usr/local/lib
两个平台上。当我编译代码时,我链接了pkg-config --libs
第三方库的参数,并且我已验证pkg-config --libs
在两个平台上返回的内容完全相同。
我的代码在两个平台上都成功编译,并且在两个平台上LD_LIBRARY_PATH
都未定义(或定义为空:)""
。但是,当我在一个平台上运行它时,它运行正常,而在另一个平台上我收到此错误:
error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory
有趣的是,那些没有工作是更新Ubuntu 和 gcc 的版本。:/
因此,我试图弄清楚正常工作的程序如何找到库,以便我可以让损坏的程序以相同的方式找到库。(即,无需设置LD_LIBRARY_PATH
)
更新:
这是我的输出cat /etc/ld.so.conf.d/*
...在工作(旧)系统上:
/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
...在损坏的(较新的)系统上:
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa
答案1
整个路径事务与所谓的多架构有关。基本上,它允许您在同一系统上拥有 32 位和 64 位库。
复制文件后,您是否运行了 ldconfig?
ldconfig creates, updates, and removes the necessary links and cache
(for use by the run-time linker, ld.so) to the most recent shared
libraries found in the directories specified on the command line, in
the file /etc/ld.so.conf, and in the trusted directories (/usr/lib and
/lib). ldconfig checks the header and file names of the libraries it
encounters when determining which versions should have their links
updated. ldconfig ignores symbolic links when scanning for libraries.
答案2
上述问题中包含的信息以及第一个(也是唯一的 ATT)回答,帮助我解决了类似问题WSL Ubuntu(在Win10 64上)!
就我而言可执行文件找不到库。我最终注意到新建的库被放置在/usr/lib64
,但多层架构的/etc/ld.so.conf.d/x86_64-linux-gnu.conf
did不是包括该目录。
所以我跑了
sudo ldconfig /usr/lib64
最后它终于解决了问题。(顺便说一下,单独运行它而不使用目录参数并不能让它“神奇地”找到库。)目前还不清楚“重启”我的 WSL bash 是否有帮助……我认为根本就没有必要。