标题可能看起来很复杂。
我创建了一个在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 缺失。
这就是为什么我需要能够告诉我库的完整依赖树的原因。
有人能给我一个暗示(不是一些无用的炫耀)吗?
非常感谢你。
答案 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被告知出了什么问题完全一样,而且几乎没有任何东西。