符号链接库是否可以(或不可以)克服“无法打开共享对象”错误?

Joh*_*lla 12 shared-library libraries

有时,出于某种原因,程序没有正确指定或包含其所有依赖项,并且启动它会导致指示缺少依赖项的错误。一个典型的错误是这样的:

cannot open shared object libudev.so.0
Run Code Online (Sandbox Code Playgroud)

我看到很多答案都建议人们通过在/usr/lib系统位置或其他系统位置创建符号链接来解决此类问题,而这似乎通常可以解决问题。但我看到同样多的评论告诉人们这是一个坏主意。这是一个有代表性的答案。

在什么情况下可以对库进行符号链接以使程序工作?绝不?有时?如果在运行完程序后删除符号链接怎么办?

这样做的后果是什么?

Nat*_*gew 12

创建这些链接的问题在于它们没有以任何有意义的方式进行管理。如果删除该库,则链接将断开。如果库被升级,它可能会因为它不希望存在的链接而遇到错误。

此外,您基本上是在向系统撒谎。在链接的示例中,您假装libudev.so.1实际上是libudev.so.0. 由于某种原因(库的不同版本),它们的名称不同。虽然这对于某些程序可能工作得很好,但版本之间的差异可能会导致问题(例如段错误或其他意外行为)。

因此,如果您专门创建此链接只是为了运行程序,并且您知道稍后将删除它,那么您解决了第一个问题,而不是第二个问题。虽然这确实解决了主要问题,但并不理想。

理想的解决方案当然是安装正确版本的库(链接示例中已接受的答案),或者根据您拥有的版本编译程序。