Ubuntu 在哪里寻找共享库?

Ubuntu 在哪里寻找共享库?

当我运行一个在运行时链接到共享库的进程(在进程启动时链接,而不是稍后用链接),除了之外dlload()它还在哪里寻找该共享库( )文件?.soLD_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 是否有帮助……我认为根本就没有必要。

相关内容