ldconfig 忽略 /usr/local/lib/ 下的某些文件

ldconfig 忽略 /usr/local/lib/ 下的某些文件

当我尝试启动某个程序时,出现以下错误消息:

加载共享库时出错:foo.so.0:无法打开共享对象文件:没有此文件或目录

因此我构建了所需的库并将其安装在目录下。但是,构建库之后,目录下/usr/local/lib/只有文件foo.sofoo.so.1和。因此我创建了指向的附加符号链接,名为。我检查了目录下某个文件中是否包含,然后启动了目录。foo.so.1.0.8/usr/local/lib/foo.so.1.0.8foo.so.0/usr/local/lib/etc/ld.so.conf.d/sudo ldconfig

不幸的是ldconfig似乎忽略了我自己创建的符号链接。ldconfig -v仅打印以下行:

foo.so.1 -> foo.so.1.0.8

ldconfig -p仅打印以下两行:

foo.so.1 (libc6,x86-64) => /usr/local/lib/foo.so.1

foo.so (libc6,x86-64) => /usr/local/lib/foo.so

该文件没有盲位foo.so.0。我该怎么办?

答案1

TL:DR:如果可能,请使用支持已安装库版本的程序版本(或构建)。

作为bodhi.zazen 说,如果没有您运行的具体命令和输出,很难知道到底发生了什么。但是,foo.so.0foo.so.1不应期望兼容。

要使使用库主版本 0 编译的程序与主版本 1 兼容,建议重建(重新编译和重新链接)该程序。此外,库为程序提供的接口可能会在主要版本之间发生变化,而且通常会发生变化,因此这有时才实用。

通常,如果可能的话,最好安装支持您要使用的库版本的程序的较新版本。

或者,如果你可以同时安装旧版本的库和新版本的库,那么程序也可以正常工作。(如果你确定没有其他程序使用当前安装的库版本,那么你可以在安装旧版本之前卸载它。如果它是由 Ubuntu 软件包提供的,那么你可以通过卸载该软件包来做到这一点。不同的主要的库的版本经常做支持会同时安装。)

如果您无法安装程序所需的库版本,并且您愿意接受程序的严重不稳定和不可预测的行为,则有时可以通过复制、将其命名为旧库,并使用十六进制编辑器编辑其中的版本信息来使其与新库一起工作。我以前做过这件事,但我从未真正依赖以这种方式工作的软件,你也不应该。

这个答案是故意笼统的。没有更多关于什么程序需要这个库,程序如何(或可以)安装,以及它支持哪些版本的库,可能无法提供更详细的建议。

答案2

据我所知,在 ubuntu 中,仅在 /usr/local/lib 中添加符号链接可能还不够。我们需要更新与此对应的 ld.so.conf 条目,以让 ldconfig 知道它必须为我们创建哪些符号链接。

正如 bodhi.zazen 提到的,从 apt 安装更简单,因为 apt 很可能也会设置 ld.so.conf 文件。

相关内容