Ubuntu在哪里寻找共享库?


24

当我运行一个在运行时链接到共享库的进程时(该进程启动时链接,以后不链接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
我认为这些地方是在中定义的/etc/ld.so.conf.d/*.conf,但我不确定。
塞勒姆2013年

似乎喜欢,但是请参阅我对OQ的更新以获取这些文件的内容...看起来应该可以找到,/usr/local/lib/libthrift-0.9.0.so但仍然会给出错误信息error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory...是否有任何理由不能从中获取目录/etc/ld.so.conf.d/*.conf
Dave Lillethun

3
尝试sudo ldconfig -v按照以下建议运行。如果仍然无法执行,请使用的输出更新您的问题ldd /path/to/your/application
塞勒姆2013年

Answers:


29

整个路径业务与称为多体系结构的事物有关。基本上,它是允许您在同一系统上拥有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.

我跑了sudo ldconfig,解决了这个问题!(不需要重新编译我的代码或其他任何内容。。。)我只是想了解,但是……您说的是“复制文件后”,但我没有复制文件。您是在构建和安装库之后,还是在编译程序之后是什么意思?
Dave Lillethun

将其放置在放置位置之后。基本上是建立一个库缓存。我认为重新启动可能还会重建缓存。
马特H

我可能会记错了,但是我相信自从安装库以来,我已经重新启动sudo ldconfig了。这是库在安装过程中经常自动为您运行的东西,而出于某种原因却没有?我只是想知道为什么我不必“通常”这样做,而只是在这种情况下才这样做……
Dave Lillethun 2013年

我认为通常情况下,软件包安装会在安装过程中运行ldconfig。也许您的较新发行版中的版本由于某种原因没有使用。
马特H

1

上述问题以及第一个(也是唯一一个ATT)答案中包含的信息,帮助我解决了WSL Ubuntu上的*类似*我的问题(在Win10 64上)的!

就我而言,可执行文件找不到库。我最终发现,新制作的图书馆得到了安置在/usr/lib64的多拱线条/etc/ld.so.conf.d/x86_64-linux-gnu.conf没有包含该目录。

所以我跑了

sudo ldconfig /usr/lib64

终于解决了。(没有目录参数单独运行它并不能使其“神奇地”找到库BTW。)目前尚不清楚“重新启动”我的WSL bash是否有帮助……我认为甚至不需要。


/ usr / local / lib /也发生了同样的事情。我创建了一个文件/etc/ld.so.conf.d/usr-local.conf,然后sudo ldconfig没有任何效果运行-加载程序未找到该目录中的库。运行后,sudo ldconfig /usr/local/lib一切正常。
Josh Milthorpe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.