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

时间:2014-04-24 08:58:18

标签: 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 缺失。

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

有人能给我一个暗示(不是一些无用的炫耀)吗?

非常感谢你。

1 个答案:

答案 0 :(得分:3)

你偶然(可能没有自己的过错)徘徊在“DLL地狱”中;问题是libapmntwraptcl.so依赖的东西,可能是间接的,没有满足其依赖性。 这类事情可能很难解决正是因为知道错误的工具(特别是系统动态链接库)默认会产生如此少的信息输出。

更糟糕的是,您显然有多个版本。这就是DLL Hell达到其最糟糕化身的地方。你需要成为一名侦探来解决这个问题;因为你指责的很多东西都是由前面的步骤所决定的,所以很难明智地进行远程操作。

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

您可能还需要查看上面ldd程序识别的库列表,并检查每个库是否也满足您所有的依赖关系并且以您期望的方式,并且您还应该承担请注意,未能找到ldd可能并不意味着代码实际上失败了。 (这太容易了。)

在执行LD_DEBUG之前,您还可以尝试将all环境变量设置为load。这将产生大量关于标准输出的信息;也许它会给你足够的东西来弄清楚出了什么问题?

最后,在Linux上,您需要记住,可以为特定库设置一个RPATH(可能会影响它的位置),还有一个系统库缓存,它也会影响事物。


我真的很抱歉错误信息不是更好。我真正可以说的是,它与Tcl被告知出了什么问题完全一样,而且几乎没有任何东西。