Ubuntu在哪里查找共享库?

当我运行一个在运行时链接到共享库的进程(在进程启动时链接,而不是后来使用dlload()链接)时,除了LD_LIBRARY_PATH之外,它会在哪里查找共享库(.so)文件?
背景:
我有一些自己编写的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中定义,但我不确定。 - Salem
看起来是这样,但请查看我对原始问题的更新,了解那些文件的内容...所以它似乎应该找到/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的输出。 - Salem
2个回答

这整个路径业务与一种称为多架构的东西有关。 基本上它是为了让您在同一系统上拥有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
在你放置它的位置之后,基本上会建立一个库缓存。我认为重新启动也可能重建缓存。 - hookenz
我可能弄错了,但我相信在安装库之后我已经重新启动过了...然而,sudo ldconfig解决了问题。这是库通常在安装时自动运行的一部分吗?为什么只有这个库需要手动运行呢?只是好奇为什么我通常不需要这样做,但在这种情况下却需要。 - Dave Lillethun
通常安装软件包时,安装过程中会运行ldconfig。我认为可能是你的新版本发行版由于某种原因没有执行此操作。 - hookenz

上述问题中的信息和第一个(也是唯一的)answer帮助我解决了在WSL Ubuntu(Win10 64位)上类似的问题!
在我的情况下,可执行文件找不到一个库。最终我注意到新建的库被放置在/usr/lib64目录下,但是/etc/ld.so.conf.d/x86_64-linux-gnu.conf的多架构行没有包括该目录。
所以我运行了
sudo ldconfig /usr/lib64
最终问题得到了解决。(单独运行而不带目录参数并不能“神奇地”找到库) 不清楚是否需要“重新启动”我的WSL bash...我认为那甚至都不需要。

我也遇到了同样的问题,与 /usr/local/lib/ 目录有关。我创建了一个文件 /etc/ld.so.conf.d/usr-local.conf,然后运行了 sudo ldconfig,但没有任何效果 - 加载器无法找到该目录中的库文件。在运行 sudo ldconfig /usr/local/lib 后,一切都正常工作了。 - Josh Milthorpe