Linux:如何找出我的库的哪个(子)依赖项需要特定的库?

标签 linux ubuntu dependencies tcl ubuntu-12.04

标题可能看起来很复杂。

我制作了一个要在 Tcl 脚本中加载的库。现在我需要将它转移到 Ubuntu 12.04。 Tclsh 给出以下错误:

couldn't load file "/apollo/applications/Linux-PORT/i586/lib/libapmntwraptcl.so":
**libgeos-3.4.2.so**: 

cannot open shared object file:  No such file or directory

while executing "load $::env(ACCLIB)/libapmntwraptcl[info sharedlibextension]"

库 libgeos 在 Ubuntu 12.04 下没有 3.4.2 版本。所以我需要知道我的库的哪个(子)依赖项需要著名的 libgeos-3.4.2.so,以便我可以重建它或找到替代方案。

非常感谢。

编辑:

感谢您提供有用的答案。我已经做了 ldd -v 或 -r。当我执行 ldd -r 时,我有 200 多个依赖项。最糟糕的是,在结果列表中我看到了 libgeos-3.3.8.so =>/usr/lib/libgeos-3.3.8.so (0xb3ea9000) (我有的版本),但是当我执行,Tclsh 说 libgeos-3.4.2.so 缺失。

这就是为什么我需要能够告诉我我的库的完整依赖关系树的原因。

谁能给我一个提示(不是一些无用的炫耀)?

非常感谢。

最佳答案

您不小心(可能不是您自己的错)误入了“DLL hell ”;问题是 libapmntwraptcl.so 所依赖的东西,可能是间接地,没有满足其依赖性。 这类事情可能很难解决,因为知道出了什么问题的工具(特别是系统动态链接器库)在默认情况下会产生如此少的信息输出。

更糟糕的是,您显然有多个版本。这就是 DLL Hell 达到其最糟糕的化身的地方。你需要成为一名侦探才能解决这个问题;明智地远程操作太难了,因为您用手指戳到的许多事情都是由前面的步骤决定的。

您需要使用 ldd libapmntwraptcl.so(在您的 shell 中,而不是在 Tcl 中)准确地确定您正在加载的版本。您还需要在有问题的 load 命令之前仔细检查您的环境变量是什么,因为其中有几个会影响加载过程。最简单的方法是将 parray env 放在有问题的 load 之前,这将在可能失败的上下文中生成所有内容的转储;阅读 ld.so 的手册页会告诉您更多关于每个可能的麻烦候选者的信息(有很多!)。

您可能还需要查看由上面的 ldd 程序识别的库列表,并检查每个库是否也以您期望的方式满足所有依赖关系,并且您应该还请记住,无法使用 ldd 定位可能并不意味着代码实际上失败了。 (那太容易了。)

您还可以在执行加载 之前尝试将LD_DEBUG 环境变量设置为all。这将产生大量关于标准输出的信息;也许它足以让您找出问题所在?

最后,在 Linux 上,您需要记住,可以为特定库设置 RPATH(这会影响找到它的位置),并且系统库缓存也会影响其他事情。


我真的很抱歉错误信息不是更好。我真正能说的是,它与 Tcl 被告知的错误一样多,而且几乎什么都没有。

关于Linux:如何找出我的库的哪个(子)依赖项需要特定的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264299/

相关文章:

linux - 提高删除窗口行结尾的 Bash 循环的性能

linux - 将 jiffies 转换为秒

c++ - 如何在 Ubuntu 中构建 OpenSMILE?

ubuntu - Varnish 似乎在工作,但 max-age=0

java - 尝试使用 SWT 会导致许多错误

python - subprocess.Popen.communicate 对于大数据集效率不高?

linux - 在 linux C 中获取 GPU 信息

python - 异常 : Version mismatch:cffi

angular - 找不到与@babel/helper-validator-identifier@^7.9.5 匹配的版本

javascript - 创建一个 JS 库并声明其他库所依赖的内容